我的 hive 有两种观点
+------------+
| 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)?
我正在通过星火从卡夫卡读取Table_1。
幻灯片持续时间为5秒
窗口持续时间为2分钟
当Table_2位于RDBMS中时, Spark 正在通过jdbc进行读取,并且具有4500条记录。
每5秒钟,kafka会以CSV格式抽取大约2K条记录。
我需要在5秒内处理数据,但目前需要8到16秒。
根据建议:
但是仍然没有改善。
注意:如果删除窗口持续时间,则该过程确实会在一段时间内执行。可能是因为要处理的数据较少。但这不是必需的。
最佳答案
使用正确的索引,可以更快地进行以下操作:
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)
上的索引。