如何在 Spark Scala SQL 查询中包含 0 值?

Posted

技术标签:

【中文标题】如何在 Spark Scala SQL 查询中包含 0 值?【英文标题】:How would I include 0 values in a Spark Scala SQL Query? 【发布时间】: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 值。

【问题讨论】:

【参考方案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'))

【讨论】:

以上是关于如何在 Spark Scala SQL 查询中包含 0 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark-Scala 解析 JSON 数据

Scala如何驾驭大规模系统?

Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?

如何在 spark-sql 查询中引用地图列?

将 spark.sql 查询转换为 spark/scala 查询

sql 查询字段中包含回车 如何查出含有回车的字段