我有以下查询(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。
谢谢
答案 0 :(得分:0)
我对性能问题的猜测是,您有一些离群的客户,并且交易量很大。我的猜测是,Hive将在单个处理器上使用window函数的order by
组件。
您可以检查是否存在任何带有聚集的异常值:
select cust, count(*)
from dataset
group by cust
order by count(*) desc;
如果您随后从查询中过滤掉异常值,您可能会发现它的效果要好得多。