Skip to content

与Hive集成

1. 环境准备

Hive版本官方推荐Hive版本Iceberg版本
2.x2.3.80.8.0-incubating – 1.1.0
3.x3.1.20.10.0 – 1.1.0
4.x4.0内置(1.4.3)

从Hive4.0版本开始,Apache Hive原生支持Iceberg表格式,无需添加任何额外的JAR包。下表展示了不同Hive版本对Iceberg表的特性支持情况:

特性Hive2/3Hive4
SQL create table✔️✔️
SQL create table as select(CTAS)✔️✔️
SQL create table like table(CTLT)✔️✔️
SQL drop table✔️✔️
SQL insert into✔️✔️
SQL insert overwrite✔️✔️
SQL delete from✔️
SQL update✔️
SQL merge into✔️
Branches and tags✔️

提示

从Iceberg 0.11.0开始,如果Hive使用Tez引擎,需要关闭向量化执行,配置hive-site.xml属性:

xml
<property>
<name>hive.vectorized.execution.enabled</name>
<value>false</value>
</property>

2. 创建和管理Catalog

Hive的配置只支持一个全局的Hadoop数据目录,相比之下Iceberg支持多种不同的Catalog类型,例如:Hive、Hadoop、亚马逊的AWS Glue和自定义Catalog。

2.1 使用默认HiveCatalog

sql
create EXTERNAL table ice_db.tbl_ice1(
    id int,
    name string,
    address string
) partitioned by (age int)
STORED BY ICEBERG
TBLPROPERTIES  ('external.table.purge'='false')

2.2 使用HadoopCatalog

sql
-- 设置iceberg.catalog的类型为hadoop
SET iceberg.catalog.hadoop_cat.type=hadoop;
SET iceberg.catalog.hadoop_cat.warehouse=hdfs://hadoop102:8020/hadoop_cat;
-- 建表
CREATE EXTERNAL TABLE ice_db.table_c(id int)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://hadoop102:8020/hadoop_cat/ice_db/table_c/'
TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');

2.3 指定路径加载

sql
-- 设置属性iceberg.catalog=location_based_table
create external table tbl_c
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
-- 通过指定的根路径来加载Iceberg表
LOCATION 'hdfs://hadoop102:8020/hadoop_cat/ice_db/table_c/'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');

3. 创建表

和直接使用Hive进行表操作大致相同,额外需要指定STORED BY ICEBERG

3.1 创建外部表

在Hive4.0中可以简写org.apache.iceberg.mr.hive.HiveIcebergStorageHandlerICEBERG

sql
CREATE external TABLE tbl_ice (ID INT) STORED BY ICEBERG;

查看HDFS可以发现,表目录在默认的hive仓库路径下, 并查看表信息:
Alt text

3.2 创建内部表

sql
CREATE TABLE tbl_ice3 (ID INT) STORED BY ICEBERG;
insert into tbl_ice3 values(1),(2);
drop table tbl_ice3;

删除表之后可以看到HDFS目录也会被删除:
Alt text

3.3 创建分区表

sql
CREATE EXTERNAL TABLE iceberg_create3 (id int,name string)
STORED BY ICEBERG
PARTITIONED BY (age int);
insert into iceberg_create3 values (1, 'jack', 33), (2, 'tony', 23), (3, 'bob', 18);

执行后查看HDFS目录:
Alt text

3.4 CTAS建表

sql
CREATE EXTERNAL TABLE t_ice1(id int,name string)  
STORED BY ICEBERG AS SELECT * FROM iceberg_create3;

4. 修改表

4.1 添加字段

sql
alter table tbl_c add columns (name string);
select * from tbl_c

执行结果:
Alt text

4.2 修改表名

sql
alter table tbl_ice1 rename to tbl_ice11;
select * from tbl_ice11;

Alt text

5. 删除表

5.1 截断表

sql
truncate table tbl_ice11;

5.2 删除表

sql
drop table tbl_ice3;

6. 插入表数据

6.1 普通插入

sql
insert into tbl_ice1 values(22);

执行结果: Alt text

6.2 覆盖插入

sql
insert overwrite table tbl_ice11 values(33);
select * from tbl_ice11;

执行结果: Alt text

7. 修改表数据

sql
update tbl_c set name='jack' where id>3;
select * from tbl_c;

执行结果:
Alt text