hive数据仓库要点
1.hive 配置开启支持事务
A.开启hive 的 ACID Transactions(hortonworks下配置了ACID开关按钮)
B.针对原生态与CDH版的hive配置如下:
<property> <name>hive.support.concurrency</name> <value>true</value> </property> <property> <name>hive.exec.dynamic.partition.mode</name> <value>nonstrict</value> </property> <property> <name>hive.txn.manager</name> <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value> </property> <property> <name>hive.compactor.initiator.on</name> <value>true</value> </property> <property> <name>hive.compactor.worker.threads</name> <value>1</value> </property>
2.创建事务表
A.创建事务表必须带有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,并且不能 带有sorted by子句
create table t1(id int , name string) clustered by (id) into 8 buckets stored as orc tblproperties ('transactional'='true'); 操作语句: insert into t1 values(1,'aaa'); insert into t1 values(2,'bbb'); update t1 set name='ccc' where id=1; delete from t1 where id=2;
B:不能修改bucket 列,否则会报错:
FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported. Column id.
C.对分区表执行insert时, 表名后要跟partition子句。
D.对已有非ORC表的转换, 只能通过新建ORC表再向新表迁移数据的方式, 直接修改原表的文件格式属 性是不行的
3.HIVE事务支持的限制
A.暂不支持BEGIN、 COMMIT和ROLLBACK语句, 所有HiveQL语句都是自动提交的。 Hive计划在未来 版本支持这些语句。
B.现有版本只支持ORC文件格式, 未来可能会支持所有存储格式。 Hive计划给表中的每行记录增加显式 或隐式的row id, 用于行级的update或delete操作。 这项功能很
值得期待, 但目前来看进展不大。
C.默认配置下, 事务功能是关闭的, 必须进行一些配置才能使用事务, 易用性不理想。
D.使用事务的表必须分桶, 而相同系统上不使用事务和ACID特性的表则没有此限制。
外部表的事务特性有可能失效。
E.不允许从一个非ACID的会话读写事务表。 换句话说, 会话中的锁管理器变量必须设置成 org.apache.hadoop.hive.ql.lockmgr.DbTxnManager, 才能与事务表一起工作。
F.当前版本只支持快照级别的事务隔离。 当一个查询开始执行后, Hive提供给它一个查询开始时间点的数 据一致性快照。 传统事务的脏读、 读提交、 可重复读或串行
化隔离级别都不支持。 计划引入的BEGIN语句, 目的就是在事务执行期间支持快照隔离级别, 而不仅 仅是面向单一语句。 Hive官方称会依赖用户需求增加其他隔离级别。
G.ZooKeeper和内存锁管理器与事务不兼容。
4.HIVE 装载表数据
A.load与load overwrite的区别是: load每次执行生成新的数据文件, 文件中是本次装载的数据。 load overwrite如表(或分区) 的数据文件不存在则生成, 存在则重新生成数据文件内容。
B.分区表比非分区表多了一种alter table ... add partition的数据装载方式。
C.对于分区表(无论内部还是外部) , load与load overwrite会自动建立名为分区键值的目录, 而alter table ... add partition, 只要用location指定数据文件所在的目录即可。
D.对于外部表, 除了在删除表时只删除元数据而保留表数据目录外, 其数据装载行为与内部表相同(外 部表的实验没有列出) 。
5.渐变维(SCD) 即是一种在多维数据仓库中实现维度历史的技术。 有三种不同的SCD技术: SCD类 型 1(SCD1) , SCD类型2(SCD2) , SCD类型3(SCD3) 。
SCD1: 通过更新维度记录直接覆盖已存在的值, 它不维护记录的历史。 SCD1一般用于修改错误的数 据。SCD2: 在源数据发生变化时, 给维度记录建立一个新的“版本”记录, 从而维护维度历史。 SCD2不删 除、 修改已存在的数据。
SCD3: 通常用作保持维度记录的几个版本。 它通过给某个数据单元增加多个列来维护历史。 例如, 为 了记录客户地址的变化, customer_dim维度表有一个
customer_address列和一个previous_customer_address列, 分别记录当前和上一个版本的地址。 SCD3 可以有效维护有限的历史, 而不像SCD2那样保存全部历史。 SCD3
很少使用。 它只适用于数据的存储空间不足并且用户接受有限维度历史的情况