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

Posted

技术标签:

【中文标题】如何在 Hive/Spark SQL 中使用窗口函数删除重叠【英文标题】:How to Remove Overlap Using Window Function in Hive/Spark SQL 【发布时间】:2019-11-11 15:04:19 【问题描述】:

我有一张包含客户和产品信息的表格。

customer_id promotion_id   product_id  Rank
1               555            222      1
1               555            223      1 
1               555            999      1
1               556            154      2
1               556            222      2
1               556            278      2 
1               557            432      3
1               557            434      3
1               557            435      3

一些促销在产品信息中重叠。例如promotion_id 555 和556 可用于产品222。我想删除promotion_id 556 并重新排名,以便promotion 557 排名第二,如下所示:

customer_id promotion_id   product_id  Rank
1               555            222      1
1               555            223      1 
1               555            999      1
1               557            432      2
1               557            434      2
1               557            435      2 

我一直在使用 SQL 中的 row_number()/rank() 函数,但我似乎无法得到它。

【问题讨论】:

promotion_id 556 的 product_id 278 部分呢? 【参考方案1】:

使用ROW_NUMBER

SELECT *, DENSE_RANK() OVER(ORDER BY promotion_id) AS new_rank
FROM (SELECT *, DENSE_RANK() OVER(PARTITION BY CUSTOMER_ID, PRODUCT_ID 
                                  ORDER BY PRODUCT_ID, PROMOTION_ID) rn
      FROM tab) s
WHERE rn = 1

【讨论】:

感谢您的解决方案,但恐怕这不起作用。 @DataTx 反例? Row_Number()需要切换到DENSE_RANK() OVER(PARTITION BY CUSTOMER_ID, PRODUCT_ID ORDER BY PRODUCT_ID, PROMOTION_ID ) 但是你的建议对我来说绝对是正确的方向。

以上是关于如何在 Hive/Spark SQL 中使用窗口函数删除重叠的主要内容,如果未能解决你的问题,请参考以下文章

Hive:Spark中如何实现将rdd结果插入到hive1.3.1表中

无法从 impala/hive/spark sql 访问“spark 注册表”

concat_ws 使用在hive spark-sql上的区别

如何引用列中的第一个非空字符串 - Cloudera Impala / Apache Hive / Spark SQL

将数据写入 Hive Spark SQL 时出现 ArrayIndexOutOfBoundsException 异常

hive/spark写入保存出现小文件过多的解决