【发布时间】:2017-06-21 11:16:00
【问题描述】:
我有一个像这样的表(例如,称为 Source):
-------------
|Name|ID|...|
-------------
|A |1 |...|
|A |2 |...|
|A |3 |...|
|B |1 |...|
|B |2 |...|
|C |1 |...|
-------------
所以每个 Name 可能有多个条目,每个条目都有一个递增的 ID(它又由 Name 分区,因为您可能已经知道了现在)。
现在,我有另一个表(称为 Dest),我从 Source 表加载,例如每日批次。但是,我只想从 Source 加载增量,所以如果我的 Dest 表是这样的:
-------------
|Name|ID|...|
-------------
|A |1 |...|
|A |2 |...|
|B |1 |...|
-------------
我只想将 Source 的差异复制到 Dest ,即:
-------------
|Name|ID|...|
-------------
|A |3 |...|
|B |2 |...|
|C |1 |...|
-------------
由于其他原因,我不能为此使用时间戳或减号,因此找到差异的唯一方法是获取每个 Name 的 MAX(ID) > 并仅检索每个 Name 的条目 > MAX(ID)。
最快的实现是通过一个子查询为每个Name准备所有MAX(ID),并用它来消除较小的ID强>s:
SELECT s.* FROM Source s
LEFT JOIN (
SELECT d.NAME, MAX(d.ID) AS MAX_ID
FROM Dest d
GROUP BY d.NAME) n
ON s.NAME = n.NAME
WHERE s.ID > COALESCE(n.MAX_ID,0)
但是,由于表中有很多条目,我相信这不会很好执行,除非 Hive 自动对其进行了足够的优化,我不确定。
我希望做的是这样的:
SELECT s.* FROM Source s
WHERE s.ID > (SELECT COALESCE(MAX(d.ID),0)
FROM Dest d
WHERE d.NAME = s.NAME)
这样,我将避免为所有条目计算 MAX(ID),而只会为当前 Name 计算它。但这显然在 Hive 中是不可能的。
所以我的问题是,在 Hive 中实现这种增量检测的最佳和最有效的方法是什么?
【问题讨论】: