【发布时间】:2020-07-10 04:24:47
【问题描述】:
我有以下查询 (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。
谢谢
【问题讨论】:
-
Hive 在 360k 行上运行此查询确实应该没有问题——除非您可能只有少数客户。
-
感谢 Gordon - 执行时间确实存在问题。我尝试在不同的可用服务器上连接到 Hive,但没有任何乐趣。明天我将与管理 Hive 的团队交谈。 360k 数据集中大约有 900 个不同的客户。