Spark与Iceberg整合DDL操作
这里使用Hadoop Catalog 来演示Spark 与Iceberg的DDL操作。
一、CREATE TABLE 创建表
Create table 创建Iceberg表,创建表不仅可以创建普通表还可以创建分区表,再向分区表中插入一批数据时,必须对数据中分区列进行排序,否则会出现文件关闭错误,代码如下:

查询结果如下:


创建Iceberg分区时,还可以通过一些转换表达式对timestamp列来进行转换,创建隐藏分区,常用的转换表达式有如下几种:
- years(ts):按照年分区

数据结果如下:


在HDFS中是按照年进行分区:


- months(ts):按照“年-月”月级别分区

数据结果如下:


在HDFS中是按照“年-月”进行分区:


- days(ts)或者date(ts):按照“年-月-日”天级别分区

数据结果如下:


在HDFS中是按照“年-月-日”进行分区:


- hours(ts)或者date_hour(ts):按照“年-月-日-时”小时级别分区

数据结果如下:


在HDFS中是按照“年-月-日-时”进行分区:


Iceberg支持的时间分区目前和将来只支持UTC,UTC是国际时,UTC+8就是国际时加八小时,是东八区时间,也就是北京时间,所以我们看到上面分区时间与数据时间不一致。
除了以上常用的时间隐藏分区外,Iceberg还支持bucket(N,col)分区,这种分区方式可以按照某列的hash值与N取余决定数据去往的分区。truncate(L,col),这种隐藏分区可以将字符串列截取L长度,相同的数据会被分到相同分区中。
二、CREATE TAEBL ... AS SELECT
Iceberg支持“create table .... as select ”语法,可以从查询语句中创建一张表,并插入对应的数据,操作如下:
1、创建表hadoop_prod.default.mytbl,并插入数据

2、使用“create table ... as select”语法创建表mytal2并查询

结果如下:


三、REPLACE TABLE ... AS SELECT
Iceberg支持“replace table .... as select ”语法,可以从查询语句中重建一张表,并插入对应的数据,操作如下:
1、创建表“hadoop_prod.default.mytbl3”,并插入数据、展示



2、重建表“hadoop_prod.default.mytbl3”,并插入对应数据



四、DROP TABLE
删除iceberg表时直接执行:“drop table xxx”语句即可,删除表时,表数据会被删除,但是库目录存在。



五、ALTER TABLE
Iceberg的alter操作在Spark3.x版本中支持,alter一般包含以下操作:
- 添加、删除列
添加列操作:ALTER TABLE ... ADD COLUMN
删除列操作:ALTER TABLE ... DROP COLUMN

最终表展示的列少了age列,多了gender、loc列:


- 重命名列
重命名列语法:ALTER TABLE ... RENAME COLUMN,操作如下:

最终表展示的列 gender列变成了xxx列:


六、ALTER TABLE 分区操作
alter 分区操作包括增加分区和删除分区操作,这种分区操作在Spark3.x之后被支持,spark2.4版本不支持,并且使用时,必须在spark配置中加入spark.sql.extensions属性,其值为:org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,在添加分区时还支持分区转换,语法如下:
- 添加分区语法:ALTER TABLE ... ADD PARTITION FIELD
- 删除分区语法:ALTER TABLE ... DROP PARTITION FIELD
具体操作如下:
1、创建表mytbl,并插入数据

在HDFS中数据存储和结果如下:




2、将表loc列添加为分区列,并插入数据,查询

在HDFS中数据存储和结果如下:




注意:添加分区字段是元数据操作,不会改变现有的表数据,新数据将使用新分区写入数据,现有数据将继续保留在原有的布局中。
3、将ts列进行转换作为分区列,插入数据并查询

在HDFS中数据存储和结果如下:




4、删除分区loc

在HDFS中数据存储和结果如下:


注意:由于表中还有ts分区转换之后对应的分区,所以继续插入的数据loc分区为null


5、删除分区years(ts)

在HDFS中数据存储和结果如下:



