【问题标题】:Storing maximum transaction amount and retaining second highest transaction amount in a lookback period存储最大交易金额并在回溯期内保留第二高交易金额
【发布时间】: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 个不同的客户。

标签: python sql hive hiveql


【解决方案1】:

我对性能问题的猜测是,您有一些异常客户进行了无数次交易。我的猜测是 Hive 将在单个处理器上使用窗口函数的 order by 组件。

您可以通过聚合检查是否有异常值:

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

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

【讨论】:

  • 谢谢,我会调查的。似乎完整的查询是在单个处理器上执行的。有没有办法改变设置来排序?
  • @SRobo 。 . .我不知道为什么 Hive 会在单个处理器上运行整个查询。它应该能够并行化partition by
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多