背景说明
删除只能在支持ACID的表上执行。
ACID 代表数据库事务的四个特征:
原子性(手术完全成功或失败,它没有离开部分数据)
一致性(一旦应用程序执行一个操作,操作的结果是可见的在每个后续操作)
隔离(由一个用户一个不完整的操作不会引起意想不到的副作用为其他用户)
持久性(一个操作完成后它将被保留下来即使面对机器或系统故障)。
长期以来,人们期望数据库系统具有这些特性,并将其作为事务功能的一部分。
从Hive 0.14.0开始,如果要在 ACID 写操作(插入、更新、删除)中使用表,则必须在该表上设置表属性“transactional=true”。
注意,一旦一个表通过 TBLPROPERTIES(“transactional”=“true”)被定义为一个ACID表,它就不能被转换回一个非 ACID 表,即,不允许更改 TBLPROPERTIES(“transactional”=“false”)。
hive.txn.manager 必须设置为 org.apache.hadoop.hive.ql.lockmgr.DbTxnManager 。可以在 hive-site.xml 中使用 DbTxnManager,也可以在会话开始时运行任何查询之前使用 DbTxnManager。在HIVE-11716之前,insert 使用之前的,update 和 delete 将被禁止。因为 HIVE-11716 操作不允许在没有 DbTxnManager 的 ACID 表上进行。然而,这并不适用于Hive 0.13.0。
如果表所有者不希望系统自动决定什么时候进行压缩,那么可以设置表属性“NO_AUTO_COMPACTION”。这将阻止所有的自动压缩。手动压缩仍然可以使用 Alter Table/Partition Compact 语句完成。
在创建或更改表时,使用 TBLPROPERTIES 子句设置表属性。在 Hive 0.x 和 1.0中,“transactional”和“NO_AUTO_COMPACTION”表属性是区分大小写的,但是从1.1.0版本(HIVE-8308)开始它们就不区分大小写。
在Hive 1.3.0和2.1.0中,可以通过 TBLPROPERTIES 设置更多的压缩相关选项。它们可以通过 CREATE TABLE 在表级设置,也可以通过 ALTER TABLE/PARTITION COMPACT 在请求级设置。它们用于覆盖仓库/表范围的设置。例如,要覆盖MR属性以影响压缩作业,可以在 CREATE TABLE 语句中添加"compactor.<mr property name>=<value>",或者在通过 ALTER TABLE 显式启动压缩时。"<mr property name>=<value>"将在压缩mr作业的JobConf上设置。同样,"tblprops.<prop name>=<value>"可用于设置/覆盖任何表属性,这些属性是由运行在集群上的代码解释的。最后,"compactorthreshold.<prop name>=<value>"可以用来覆盖属性从"新的配置事务参数"的上面的表“.threshold”和控制何时由系统触发压缩。
解决样例:
在建表时设置 TBLPROPERTIES 中的压缩选项和 transactional
CREATE TABLE table_name (
id int,
name string
)
CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true",
"compactor.mapreduce.map.memory.mb"="2048", -- specify compaction map job properties
"compactorthreshold.hive.compactor.delta.num.threshold"="4", -- trigger minor compaction if there are more than 4 delta directories
"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5" -- trigger major compaction if the ratio of size of delta files to
-- size of base files is greater than 50%
);
通过 ALTER 更改 TBLPROPERTIES 中的压缩选项
ALTER TABLE table_name COMPACT 'minor'
WITH OVERWRITE TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="3072"); -- specify compaction map job properties
ALTER TABLE table_name COMPACT 'major'
WITH OVERWRITE TBLPROPERTIES ("tblprops.orc.compress.size"="8192"); -- change any other Hive table properties
ALTER TABLE app_mbl_user_trmnl_trail_info_d1 SET TBLPROPERTIES ("transactional"="true"); -- 更改为事务表ACID,前提表的格式是ACID支持的,例如 orc
注意,一旦一个表通过 TBLPROPERTIES(“transactional”=“true”)被定义为一个ACID表,它就不能被转换回一个非 ACID 表,即,不允许更改 TBLPROPERTIES(“transactional”=“false”)。
注意:在往 ACID 表中 insert 数据之前,应该先 set hive.support.concurrency=true;set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;否则会报以下错误:This command is not allowed on an ACID table mydb1.table_name with a non-ACID transaction manager
————————————————
版权声明:本文为CSDN博主「飞朋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zpf_940810653842/article/details/102513730