我的 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秒。

根据建议:
  • 我已分别按CampaignId和hash列对Table_1进行了分区。
  • 我已分别通过accountId和parentAccountID列对Table_2进行了分区。
  • 我已经实现了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)上的索引。

    08-28 04:41