在回溯期内存储最大交易量并保持第二高的交易量

时间:2020-03-29 19:35:46

标签: python sql hive hiveql

我有以下查询(HiveQL),该查询可计算自交易开始之日起客户的最大交易金额,并保留交易之前的先前最大交易金额。

查询

PROC SQL;
  CREATE TABLE TXN_AMT AS
    SELECT *, 
          MAX(TXN_AMT) OVER (PARTITION BY CUST ORDER BY TXN_DATE DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS MAX
          MAX(TXN_AMT) OVER (PARTITION BY CUST ORDER BY TXN_DATE DESC ROWS BETWEEN 1 AND UNBOUNDED FOLLOWING) as Max2
   FROM dataset; 
QUIT;

输出数据示例

cust txn_date txn_amt max max2   
1    29/3/20   100    100  70  
1    28/3/20   50     70   20  
1    2/3/20    20     70   20  
1    15/2/20   70     70   - (no previous txn to take max2)  

问题

我需要在具有数百万行的数据集上运行此查询。不幸的是,该查询无法针对360k行数据集运行。

尝试过的解决方案

我尝试直接在Hive&Spark上运行查询,但没有成功-运行时间太长。我尝试使用lag()函数重写代码,但没有成功。

有人知道如何重写以上查询以产生具有最佳性能的所需输出吗?查询必须使用Python或HiveQL。

谢谢

1 个答案:

答案 0 :(得分:0)

我对性能问题的猜测是,您有一些离群的客户,并且交易量很大。我的猜测是,Hive将在单个处理器上使用window函数的order by组件。

您可以检查是否存在任何带有聚集的异常值:

select cust, count(*)
from dataset
group by cust
order by count(*) desc;

如果您随后从查询中过滤掉异常值,您可能会发现它的效果要好得多。