如何在 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 值?的主要内容,如果未能解决你的问题,请参考以下文章
Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?