Spark,Hive SQL - 实现窗口功能?

Posted

技术标签:

【中文标题】Spark,Hive SQL - 实现窗口功能?【英文标题】:Spark, Hive SQL - implementing window function? 【发布时间】:2016-07-20 10:21:36 【问题描述】:

我正在尝试实施以下解决方案:window function

我有以下df:

+------------+----------------------+-------------------+                                 
|increment_id|base_subtotal_incl_tax|          eventdate|                                 
+------------+----------------------+-------------------+                                 
|        1086|            14470.0000|2016-06-14 09:54:12|                                 
|        1086|            14470.0000|2016-06-14 09:54:12|                                 
|        1086|            14470.0000|2015-07-14 09:54:12|                                 
|        1086|            14470.0000|2015-07-14 09:54:12|                                 
|        1086|            14470.0000|2015-07-14 09:54:12|                                 
|        1086|            14470.0000|2015-07-14 09:54:12|                                 
|        1086|             1570.0000|2015-07-14 09:54:12|                                 
|        5555|            14470.0000|2014-07-14 09:54:12|                                 
|        5555|            14470.0000|2014-07-14 09:54:12|                                 
|        5555|            14470.0000|2014-07-14 09:54:12|                                 
|        5555|            14470.0000|2014-07-14 09:54:12|                                 
+------------+----------------------+-------------------+ 

我正在尝试将窗口函数运行为:

WindowSpec window = Window.partitionBy(df.col("id")).orderBy(df.col("eventdate").desc());
df.select(df.col("*"),rank().over(window).alias("rank")) //error for this line
         .filter("rank <= 2")
         .show();

我想要的是为每个用户获取最后两个条目(最后一个是最新日期,但由于它是按日期降序排列的,前两行):

+------------+----------------------+-------------------+                                 
|increment_id|base_subtotal_incl_tax|          eventdate|                                 
+------------+----------------------+-------------------+                                 
|        1086|            14470.0000|2016-06-14 09:54:12|                                 
|        1086|            14470.0000|2016-06-14 09:54:12|   
|        5555|            14470.0000|2014-07-14 09:54:12|                                 
|        5555|            14470.0000|2014-07-14 09:54:12|                                     
+------------+----------------------+-------------------+ 

但我明白了:

+------------+----------------------+-------------------+----+
|increment_id|base_subtotal_incl_tax|          eventdate|rank|                            
+------------+----------------------+-------------------+----+                            
|        5555|            14470.0000|2014-07-14 09:54:12|   1|                            
|        5555|            14470.0000|2014-07-14 09:54:12|   1|                            
|        5555|            14470.0000|2014-07-14 09:54:12|   1|                            
|        5555|            14470.0000|2014-07-14 09:54:12|   1|                            
|        1086|            14470.0000|2016-06-14 09:54:12|   1|                            
|        1086|            14470.0000|2016-06-14 09:54:12|   1|                            
+------------+----------------------+-------------------+----+

我错过了什么?

【问题讨论】:

【参考方案1】:

所有值都相等 -> 等级相等。试试row_number

df.select(df.col("*"),row_number().over(window).alias("rank"))
     .filter("rank <= 2")
     .show();

【讨论】:

谢谢!这完美!因此,原来的似乎也适用于现实生活中的数据,因为时间戳会有所不同。 :)

以上是关于Spark,Hive SQL - 实现窗口功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive/Spark SQL 中使用窗口函数删除重叠

Spark Hive - 具有窗口功能的 UDFArgumentTypeException?

hive 使用同一个session执行不同的sql注意事项

spark SQL和hive到底啥关系

Spark 实践 | Hive SQL 迁移 Spark SQL 在滴滴的实践

Hive进阶-- Hive SQLSpark SQL和 Hive on Spark SQL