Hive 中的 ACID 属性允许使用以下语法从表中删除行:
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
这是意料之中的。我建议在 ids 之间添加一个分隔符。
DELETE FROM table
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(CONCAT(id1,"-"), id2) FROM raw_table)
两种解决方案都应该只执行 1 个带有映射器和缩减阶段的作业,因此执行计划和性能应该几乎相同
问候!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句