#sql #scala #apache-spark
#sql #scala #apache-spark
Вопрос:
Я пытаюсь выполнить цикл по фрейму данных и подсчитать, сколько раз дата встречается в определенных диапазонах дат. Код работает нормально. Единственная проблема заключается в том, что если он не находит никаких дат в заданном диапазоне дат, он не включает этот диапазон дат со значением 0 в результирующий фрейм данных. Позвольте мне показать вам пример:
вот мой входной фрейм данных,
и вот мой фрейм данных диапазона ячеек,
SQL-запрос, который я использую, это:
val countSql = """
SELECT concat(date_format(c.st_dt,'MM-dd-yyyy'),' -- ',date_format(c.end_dt,'MM-dd-yyyy')) as date_range, c.bin_count
FROM (
(SELECT
b.st_dt, b.end_dt, count(1) as bin_count
FROM
(select to_date(input_date,'MM-dd-yyyy') as date_input , * from input_table) a
left join
(select to_date(start_date,'MM-dd-yyyy') as st_dt, to_date(end_date,'MM-dd-yyyy') as end_dt from bin_range ) b
on
a.date_input >= b.st_dt and a.date_input < b.end_dt
group by 1,2) ) c"""
В том виде, в котором код находится сейчас, он вернет пустой фрейм данных, потому что никакие даты из входного фрейма данных не попадают в предоставленные диапазоны ячеек. Но я хотел бы строку для каждого диапазона ячеек и соответствующее значение 0 рядом с ним, если ничего не найдено.
Ответ №1:
Вам нужно иметь range_table
слева от соединения, если вы хотите, чтобы все диапазоны отображались в вашем конечном результате. Кроме того, вы могли бы упростить его для чего-то подобного :
SELECT CONCAT(DATE_FORMAT(r.st_dt,'MM-dd-yyyy'),' -- ', DATE_FORMAT(r.end_dt,'MM-dd-yyyy')) AS date_range,
COUNT(i.date_input) AS bin_count
FROM bin_range r
LEFT JOIN input_table i
ON i.date_input >= r.st_dt AND i.date_input < r.end_dt
GROUP BY CONCAT(DATE_FORMAT(r.st_dt,'MM-dd-yyyy'),' -- ', DATE_FORMAT(r.end_dt,'MM-dd-yyyy'))