【发布时间】:2022-10-03 10:39:15
【问题描述】:
我是 hive 的初学者,并且知道非事务性表不支持更新/删除操作。我不清楚为什么不支持这些操作?另外,想知道是否存在更新非事务表的方法。
【问题讨论】:
标签: hive
我是 hive 的初学者,并且知道非事务性表不支持更新/删除操作。我不清楚为什么不支持这些操作?另外,想知道是否存在更新非事务表的方法。
【问题讨论】:
标签: hive
为什么不支持这些操作?
事务表是 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
你也可以合并。您也可以从其他来源插入/更新/删除数据。
【讨论】: