apache-spark - Spark SQL 需要 4 个连续的时间间隔
问题描述
这是我的桌子:
+--------+----+----------+----+
| station|temp| dateS|hour|
+--------+----+----------+----+
|Roma | 2.2|2018-10-02| 1|
|Roma | 1.5|2018-10-02| 2|
|Roma | 1.4|2018-10-02| 3|
|Roma | 1.4|2018-10-02| 4|
|Milano | 0.6|2018-11-02| 12|
|Milano | 1.0|2018-11-02| 13|
|Napoli | 0.3|2018-12-02| 20|
|Napoli | 0.0|2018-12-02| 21|
|Napoli | 1.8|2018-12-02| 4|
|Napoli | 2.0|2018-12-03| 5|
|Napoli | 1.8|2018-12-03| 6|
+--------+----+----------+----+
我想连续4小时(显然在同一天连续4小时)记录存在的车站。例如只显示罗马,因为同一天有 4 个连续小时(2018-10-02)...
我尝试编写查询,但没有...
解决方案
我尝试过使用引导窗口功能。我通过对 station 和 dateS 进行分区并按小时排序来排列数据框,并计算与前一小时的差异。如果我们考虑连续 4 个小时,那么差异列中应该有三个 1 一个接一个。为了弄清楚这一点,我收集了基于 station 和 dateS 的所有差异,并检查它是否包含“1 1 1”。相同的代码如下所示。我希望它会有所帮助。
//Creating Test Data
val df = Seq(("Roma",2.2,"2018-10-02",1 )
, ("Roma",1.5,"2018-10-02",2 )
, ("Roma",1.4,"2018-10-02",3 )
, ("Roma",1.4,"2018-10-02",4 )
, ("Milano",0.6,"2018-11-02",12 )
, ("Milano",1.0,"2018-11-02",13 )
, ("Napoli",0.3,"2018-12-02",20 )
, ("Napoli",0.0,"2018-12-02",21 )
, ("Napoli",1.8,"2018-12-02",4 )
, ("Napoli",2.0,"2018-12-03",5 )
, ("Napoli",1.8,"2018-12-03",6))
.toDF("station", "temp", "dateS", "hour")
val filterDF = df.withColumn("hour_lead", lead($"hour", 1)
.over(Window.partitionBy("station","dateS")
.orderBy(col("hour")))
.filter($"hour_lead".isNotNull)
.withColumn("hour_diff", $"hour_lead" - $"hour")
.groupBy("station","dateS")
.agg(collect_list($"hour_diff".cast("string")).as("hour_diff_list"))
.withColumn("hour_diff_list_str",
concat(lit(" "),
concat_ws(" ", $"hour_diff_list"),
lit(" ")))
.filter($"hour_diff_list_str".contains(" 1 1 1 "))
filterDF.show(false)
+-------+----------+--------------+------------------+
|station|dateS |hour_diff_list|hour_diff_list_str|
+-------+----------+--------------+------------------+
|Roma |2018-10-02|[1, 1, 1] | 1 1 1 |
+-------+----------+--------------+------------------+
推荐阅读
- javascript - 如何使用 RxJS 以适当的格式返回 observable 以及额外的单独分页数据
- c# - 更好的图像信息获取?
- java - 检查字符串一是否在java中包含字符串二
- github - 如果对 github 操作有条件,是否可以进行模式匹配?
- oracle - Artifactory Derby DB 迁移到 Oracle
- excel - 将特定单元格填充到同一工作簿中另一个工作表的最后一行
- javascript - 添加两个数组,其中两个数组的现有成员和重复成员替换重复的成员
- karate - 关于如何在一个项目中使用 Http 和 ssl 配置空手道
- c# - 操作数类型冲突:加密的 varchar(255) 与 varchar 不兼容 - 带有 Upper 的存储过程 - 始终加密
- visual-studio - 如何在模拟器上运行 UWP 应用并模拟位置?