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 个带有映射器和减少阶段的作业,因此执行计划和性能应该几乎相同
此致!
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 个带有映射器和减少阶段的作业,因此执行计划和性能应该几乎相同
此致!