【问题标题】:Hive delete row with composite primary key具有复合主键的 Hive 删除行
【发布时间】:2017-08-04 13:02:36
【问题描述】:

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)

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

【问题讨论】:

    标签: sql hive sql-delete acid


    【解决方案1】:

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

    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 个带有 mapper 和 reduce 阶段的 Job,因此执行计划和性能应该几乎相同

    问候!

    【讨论】:

    • 非常感谢您的回答。我实际上是使用 EXISTS 的第一种方法,你认为它会更耗时吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2014-03-16
    • 2012-01-12
    相关资源
    最近更新 更多