【问题标题】:How to do update/delete operations on non-transactional table in hive如何对 hive 中的非事务表进行更新/删除操作
【发布时间】:2022-10-03 10:39:15
【问题描述】:

我是 hive 的初学者,并且知道非事务性表不支持更新/删除操作。我不清楚为什么不支持这些操作?另外,想知道是否存在更新非事务表的方法。

【问题讨论】:

    标签: hive


    【解决方案1】:

    为什么不支持这些操作?

    事务表是 hive 中的特殊托管表,应采用 orc 格式、分桶(hive 2.0)、启用 dbtransacmanager 和启用并发。这些属性确保我们可以进行 ACID 操作。并且每个 DML(DEL/UPD/MERGE/INS) 都会创建跟踪更改的增量文件。所以,hive 做了很多内部操作来维护表和数据。

    想知道是否存在更新非事务表的方法。

    当然有。
    这个想法是在更改数据后截断并插入整个数据。 您可以使用以下代码更新字段。 假设您有 emp 表,并且您想将 emp 薪水更新为 5000,id =10。为简单起见,emp 表只有 3 列 - empid、empname、empsal。

    Insert overwrite emp -- truncate and load emp table
    Select empid, empname, empsal from emp where id <> 10 -- non changed data
    union all
    Select empid, empname, 5000 empsal from emp where id = 10 -- union to changed data
    

    您可以使用类似的 sql 删除员工 id 10。

    Insert overwrite emp -- truncate and load emp table
    Select empid, empname, empsal from emp where id <> 10 -- insert when emp id not equal to 10 which means it gets deleted from emp
    

    你也可以合并。您也可以从其他来源插入/更新/删除数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2017-12-24
      • 2011-07-03
      相关资源
      最近更新 更多