【发布时间】:2017-02-20 13:19:48
【问题描述】:
我的蜂巢中有两个视图
+------------+
| 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 秒。
根据建议:
- 我已分别按列 campaignId 和哈希对 Table_1 进行了重新分区。
- 我已分别按 accountId 和 parentAccountID 列对 Table_2 进行了重新分区。
- 我已经实现了 MAPJOIN。
但仍然没有改善。
注意:如果我删除窗口持续时间,那么该过程确实会在一段时间内执行。可能是因为要处理的数据较少。但这不是要求。
【问题讨论】:
-
(1) 您如何定义“慢”? (2) 我们在谈论什么卷?
-
我在 Spark Streaming 中使用它,每 5 秒处理一次数据。但它需要超过 10 秒来处理每批。 (注意:幻灯片持续时间为 5 秒,但窗口持续时间为 10 秒)。每批大约有 24K 条记录。
-
你需要'hash'列吗?
-
是的。我按它分组。
-
您是否对每个流上的每个 RDD(DStream)进行此查询?因为我觉得在每个流中创建 HiveContext 和 Hive 查询可能很昂贵。
标签: sql hadoop hive query-optimization hiveql