Hive 删除具有复合主键的行

Hive delete row with composite primary key

Hive 中的 ACID 属性允许使用以下语法从 table 中删除行:

DELETE FROM table 
WHERE id IN (SELECT id FROM raw_table)

但是当 primary_key 由多列组成时删除行的最佳解决方案是什么?

我用 EXISTS 尝试了以下操作:

DELETE FROM table 
WHERE EXISTS (SELECT id1, id2 FROM raw_table 
              WHERE raw_table.id1 = table.id1 AND raw_table.id2 = table.id2) 

或以下(连接所有列,不确定这是否有效):

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(id1, id2) FROM raw_table)

您对最佳解决方案有什么建议吗?

使用存在的解决方案是有效的。此外,您的解决方案连接值是有效的,但取决于您可以找到的值,您可能会删除不需要的数据,例如

id1: 01
id2: 1

您将删除带有 011 的行,但它也与

匹配
id1: 0
id2: 11

这不是预期的。我建议在 ID 之间添加一个分隔符。

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(CONCAT(id1,"-"), id2) FROM raw_table)

两种解决方案应该只执行 1 个带有映射器和减少阶段的作业,因此执行计划和性能应该几乎相同

此致!