Как бы я включил 0 значений в SQL-запрос Spark Scala?

#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'))