与Hive集成
1. 环境准备
Hive版本 | 官方推荐Hive版本 | Iceberg版本 |
---|---|---|
2.x | 2.3.8 | 0.8.0-incubating – 1.1.0 |
3.x | 3.1.2 | 0.10.0 – 1.1.0 |
4.x | 4.0 | 内置(1.4.3) |
从Hive4.0版本开始,Apache Hive原生支持Iceberg表格式,无需添加任何额外的JAR包。下表展示了不同Hive版本对Iceberg表的特性支持情况:
特性 | Hive2/3 | Hive4 |
---|---|---|
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.HiveIcebergStorageHandler
为ICEBERG
sql
CREATE external TABLE tbl_ice (ID INT) STORED BY ICEBERG;
查看HDFS可以发现,表目录在默认的hive仓库路径下, 并查看表信息:
3.2 创建内部表
sql
CREATE TABLE tbl_ice3 (ID INT) STORED BY ICEBERG;
insert into tbl_ice3 values(1),(2);
drop table tbl_ice3;
删除表之后可以看到HDFS目录也会被删除:
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目录:
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
执行结果:
4.2 修改表名
sql
alter table tbl_ice1 rename to tbl_ice11;
select * from tbl_ice11;
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);
执行结果:
6.2 覆盖插入
sql
insert overwrite table tbl_ice11 values(33);
select * from tbl_ice11;
执行结果:
7. 修改表数据
sql
update tbl_c set name='jack' where id>3;
select * from tbl_c;
执行结果: