如何在 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