【问题标题】:How would I include 0 values in a Spark Scala SQL Query?如何在 Spark Scala SQL 查询中包含 0 值?
【发布时间】:2021-01-04 09:07:12
【问题描述】:

我正在尝试遍历数据框并计算日期在特定日期范围内出现的次数。代码工作正常。唯一的问题是,如果它在给定的日期范围内找不到任何日期,则它不会在结果数据框中包含值为 0 的日期范围。让我给你举个例子:

这是我的输入数据框,

这是我的 bin 范围数据框,

我使用的 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"""

代码现在的方式是,它将返回一个空数据帧,因为输入数据帧中的日期不属于提供的 bin 范围。但如果没有找到,我想为每个 bin 范围设置一行,并在其旁边设置一个相应的 0 值。

【问题讨论】:

    标签: sql scala apache-spark


    【解决方案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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2018-04-01
      • 2014-07-03
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多