簡體   English   中英

無法使用 WINDOW 函數(Spark SQL)計算 DISTINCT

[英]Not able to COUNT DISTINCT using WINDOW functions (Spark SQL)

假設我有一個數據集樣本(表 1),如下所示 -

表格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, 
t1.customer_id, 
t1.creation_date, 
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.customer_id, t1.creation_date;

問題:長時間運行的查詢,因為表 1 有數百萬行

是否有任何解決方法(例如,使用 window 函數)來優化 Spark SQL 中的此查詢? 注意:window 函數不允許不同計數。

計算客戶第一次出現的次數:

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;

注意:這也計算當前行。 我猜這對於你想做的事情是可以接受的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM