更新时间:2026-06-11 GMT+08:00
分享

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 ...;

相关文档