微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 WINDOW 函数计算 DISTINCT (Spark SQL)

如何解决无法使用 WINDOW 函数计算 DISTINCT (Spark SQL)

假设我有一个数据集样本(表 1),如下所示 -

Table 1

这里,一个客户可以使用多个令牌,一个令牌可以被多个客户使用。我正在尝试获取记录的每个令牌、客户和创建日期,以及在创建日期之前使用此令牌的客户数量

当我尝试在 Spark sql 中执行此查询时,出现以下错误 -

选项 1(相关子查询

SELECT 
t1.token,t1.customer_id,t1.creation_date,(SELECT COUNT(disTINCT t2.customer_id) FROM Table 1  t2
AND t1.token = t2.token 
AND t2.creation_date < t1.creation_date) cust_cnt
FROM Table 1  t1;

错误:非等式谓​​词中不允许使用相关列

选项 2(交叉连接)

SELECT 
t1.token,COUNT(disTINCT t2.customer_id) AS cust_cnt
FROM Table 1 t1,Table 1 t2
WHERE t1.token = t2.token
AND t2.creation_date < t1.creation_date 
GROUP BY t1.token,t1.creation_date;

问题:长时间运行的查询,因为表 1 有数百万行

是否有任何解决方法(例如使用窗口函数)来优化 Spark sql 中的此查询?注意:窗口函数不允许不同的计数。

解决方法

计算客户第一次出现的次数:

SELECT t1.token,t1.customer_id,t1.creation_date,SUM(CASE WHEN seqnum = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY token ORDER BY creation_date) as cust_cnt
FROM (SELECT t1.*,ROW_NUMBER() OVER (PARTITION BY token,customer_id ORDER BY creation_date) as seqnum
      FROM Table1  t1
     ) t1;

注意:这也在计算当前行。我猜这对于您想做的事情是可以接受的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。