gpt4 book ai didi

sql - hive 连接的替代方案

转载 作者:可可西里 更新时间:2023-11-01 15:57:22 26 4
gpt4 key购买 nike

我的 hive 中有两个 View

+------------+
| Table_1 |
+------------+
| hash |
| campaignId |
+------------+

+-----------------+
| Table_2 |
+-----------------+
| campaignId |
| accountId |
| parentAccountID |
+-----------------+

现在我必须获取按 accountId 和 parentAccountID 过滤的“Table_1”数据,为此我编写了以下查询:

SELECT /*+ MAPJOIN(T2) */ T1.hash, COUNT(T1.campaignId) num_campaigns
FROM Table_1 T1
JOIN Table_2 T2 ON T1.campaignId = T2.campaignId
WHERE (T2.accountId IN ('aid1', 'aid2') OR T2.parentAccountID IN ('aid1', 'aid2')
GROUP BY T1.hash

此查询有效但速度很慢。除了这个 (JOIN) 有更好的选择吗?

我正在通过 spark 从 kafka 读取 Table_1。
幻灯片持续时间为 5 秒
窗口持续时间为 2 分钟

虽然 Table_2 在 RDBMS 中,spark 正在通过 jdbc 读取并且它有 4500 条记录。

每隔 5 秒,kafka 就会以 CSV 格式输入大约 2K 条记录。
我需要在 5 秒内处理数据,但目前需要 8 到 16 秒。

根据建议:

  1. 我已分别按 campaignId 和哈希列对 Table_1 进行重新分区。
  2. 我已分别按列 accountId 和 parentAccountID 对 Table_2 重新分区。
  3. 我已经实现了 MAPJOIN。

但还是没有起色。

注意:如果我删除了窗口持续时间,那么进程会在时间内执行。可能是因为要处理的数据较少。但这不是要求。

最佳答案

使用正确的索引,以下操作会更快:

SELECT T1.*
FROM Table_1 T1 JOIN
Table_2 T2
ON T1.campaignId = T2.campaignId
WHERE T2.accountId IN ('aid1', 'aid2')
UNION ALL
SELECT T1.*
FROM Table_1 T1 JOIN
Table_2 T2
ON T1.campaignId = T2.campaignId
WHERE T2.parentAccountID IN ('aid1', 'aid2') AND
T2.accountId NOT IN ('aid1', 'aid2') ;

第一个可以考虑 Table_2(accountId, campaignId) 上的索引,第二个可以考虑 Table_2(parentAccountID, accountId, campaignId) 上的索引。

关于sql - hive 连接的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42345658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com