CREATE TABLE
CREATE TABLE
Spark可以在任何Iceberg Catalog中创建表,Iceberg会将Spark中的列类型转换为相应的Iceberg类型。命令如下:
SET spark.sql.catalog.prod = org.apache.iceberg.spark.SparkCatalog;
SET spark.sql.catalog.prod.type = hive;
CREATE DATABASE IF NOT EXISTS prod.db;
CREATE TABLE prod.db.sample (id bigint, data string) USING iceberg;
创建表命令支持所有范围的Spark create子句,例如:
- PARTITIONED BY:配置分区。
- LOCATION:设置表位置。
- COMMENT:设置表描述。
- TBLPROPERTIES ('key'='value', ...):设置表配置。
PARTITIONED BY
创建分区表的命令为:
CREATE TABLE prod.db.sample (id bigint, data string, category string) USING iceberg PARTITIONED BY (category);
该子句还支持转换表达式来创建隐式分区:
CREATE TABLE prod.db.sample (id bigint, data string, category string, ts timestamp) USING iceberg PARTITIONED BY (bucket(16, id), days(ts), category);
转换表达式支持的转换范围包括:
- year(ts):按年份进行分区。
- month(ts):按月份进行分区。
- day(ts) or date(ts):等同于dateint分区,即按日期整数格式分区。
- hour(ts) or date_hour(ts):等同于dateint + 小时分区,即按日期整数格式与小时组合分区。
- bucket(N, col):按列(col)的哈希值对N取模后的结果进行分桶分区。
- truncate(L, col):按列(col)值截断至指定长度(L)后进行分区,具体规则如下:
- 字符串类型:截断为指定长度(L)的字符串。
- 整数(Integer)与长整数(Long)类型:按区间截断,例如truncate (10, i)会生成 0、10、20、30……分区区间。
CREATE TABLE AS SELECT
当使用SparkCatalog时,Iceberg支持将CTAS(CREATE TABLE ... AS SELECT)作为原子操作执行。Iceberg同样支持在SparkSessionCatalog中执行CTAS操作,但该场景下的CTAS不具备原子性。
CREATE TABLE prod.db.sample USING iceberg AS SELECT ...;
通过CTAS操作生成的新表,不会从SELECT语句所指定的源表中集成分区规范和表属性。如果需要为该新建表配置分区规范或表属性,可在CTAS语句中通过PARTITIONED BY子句明确声明分区规范,通过TBLPROPERTIES子句自定义表属性。命令为:
CREATE TABLE prod.db.sample USING iceberg PARTITIONED BY (part) TBLPROPERTIES ('key'='value') AS SELECT ...; REPLACE TABLE AS SELECT
当使用SparkCatalog时,Iceberg支持将RTAS(REPLACE TABLE ... AS SELECT)作为原子操作执行。在SparkSessionCatalog中同样支持RTAS操作,但该场景下的RTAS不具备原子性。
原子性表替换会基于SELECT查询的结果创建新快照,同时保留表的历史记录。使用方法为:
- 方式一:
REPLACE TABLE prod.db.sample USING iceberg AS SELECT ...;
- 方式二:
REPLACE TABLE prod.db.sample USING iceberg PARTITIONED BY (part) TBLPROPERTIES ('key'='value') AS SELECT ...; - 方式三:
CREATE OR REPLACE TABLE prod.db.sample USING iceberg AS SELECT ...;