跳转至

DDL

CREATE TABLE

在 Arctic Catalog 下使用 USING ARCTIC 指定使用 Arctic 数据源即可通过 CREATE TABLE 语句创建 Arctic 表。 如果 Catalog 的类型是 Hive ,则创建的是 Hive 兼容表。

CREATE TABLE arctic_catalog.db.sample (
    id bigint  COMMENT "unique id",
    data string
) USING arctic 

PRIMARY KEY

CREATE TABLE 语句中使用 PRIMARY KEY 指定主键列,这样即可创建有主键表。 Arctic 将通过 MOR(Merge on read) 和 Optimize 实现主键列上的唯一性。

CREATE TABLE arctic_catalog.db.sample (
    id bigint  COMMENT "unique id",
    data string ,
    PRIMARY KEY (id)
) USING arctic 

PARTITIONED BY

CREATE TABLE 语句中使用 PARTITIONED BY 指定分区方式,这样即可创建分区表。

CREATE TABLE arctic_catalog.db.sample (
    id bigint,
    data string,
    category string)
USING arctic
PARTITIONED BY (category)

PARTITIONED BY 子句中可以定义 分区表达式, arctic 支持 iceberg 中全部分区表达式

CREATE TABLE arctic_catalog.db.sample (
    id bigint,
    data string,
    category string,
    ts timestamp, 
    PRIMARY KEY (id) )
USING arctic
PARTITIONED BY (bucket(16, id), days(ts), category)

可使用的 transform 有:

  • years(ts): 截取时间类型字段作为分区值,精度到 year
  • months(ts): 截取时间类型字段作为分区值, 精度到 month
  • days(ts) or date(ts): 截取时间类型字段作为分区值,精度到 day
  • hours(ts) or date_hour(ts): 截图时间类型字段作为分区值,精度到 hour
  • bucket(N, col): 取某一列上的 hash 值作为分区值
  • truncate(L, col): 截取某一列上前 L 个字符作为分区值

Hive 类型的 Catalog 不支持分区表达式。

CREATE TABLE ... AS SELECT

CREATE TABLE arctic_catalog.db.sample
USING arctic
AS SELECT ...

CREATE TABLE ... AS SELECT 语法作用为创建表并将查询结果写入表中,主键、分区、以及 properties 不会从源表中继承,需单独配置。 可以通过 SPARK SQLset spark.sql.arctic.check-source-data-uniqueness.enabled = true 开启对源表主键的唯一性校验,若存在相同主键,写入时会报错提示。

创建带主键、分区、preoperties 的表,可以使用如下语法:

CREATE TABLE arctic_catalog.db.sample
PRIMARY KEY(id) USING arctic 
PARTITIONED BY (pt)  
TBLPROPERTIES (''prop1''=''val1'', ''prop2''=''val2'')
AS SELECT ...
CREATE TABLE ... AS SELECT 在当前版本没有原子性保证

CREATE TABLE ... LIKE

CREATE TABLE ... LIKE 语法会将表结构包括主键、分区复制到新表中,但不会复制数据。

CREATE TABLE arctic_catalog.db.sample
LIKE arctic_catalog.db.sample2
USING arctic
TBLPROPERTIES ('owner'='xxxx');

因为 primary key 不是 Spark 标准语法,所以如果源表是 Arctic 表,且有主键,新建表可以复制主键这部分的 schema 信息,如果是其他类型的表,则无法复制

REPLACE TABLE ... AS SELECT

REPLACE TABLE ... AS SELECT 语法在当前版本只支持无主键表

REPLACE TABLE arctic_catalog.db.sample
USING arctic
AS SELECT ...

REPLACE TABLE ... AS SELECT 在当前版本没有原子性保证

DROP TABLE

DROP TABLE arctic_catalog.db.sample;

TRUNCATE TABLE

Arctic Spark 支持 TRUNCATE TABLE 语法用于删除表中所有行

TRUNCATE TABLE arctic_catalog.db.sample;

ALTER TABLE

Arctic 支持的 ALTER TABLE 语法包括:

  • ALTER TABLE ... SET TBLPROPERTIES
  • ALTER TABLE ... ADD COLUMN
  • ALTER TABLE ... RENAME COLUMN
  • ALTER TABLE ... ALTER COLUMN
  • ALTER TABLE ... DROP COLUMN
  • ALTER TABLE ... DROP PARTITION

ALTER TABLE ... SET TBLPROPERTIES

ALTER TABLE arctic_catalog.db.sample SET TBLPROPERTIES (
    'read.split.target-size'='268435456'
);

使用 UNSET 可以移除 properties:

ALTER TABLE arctic_catalog.db.sample UNSET TBLPROPERTIES ('read.split.target-size');

ALTER TABLE ... ADD COLUMN

ALTER TABLE arctic_catalog.db.sample
ADD COLUMNS (
    new_column string comment 'new_column docs'
  );

可以同时添加多个列,用逗号分隔。

-- create a struct column
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN point struct<x: double, y: double>;

-- add a field to the struct
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN point.z double;
-- create a nested array column of struct
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN points array<struct<x: double, y: double>>;

-- add a field to the struct within an array. Using keyword 'element' to access the array's element column.
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN points.element.z double;
-- create a map column of struct key and struct value
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN points map<struct<x: int>, struct<a: int>>;

-- add a field to the value struct in a map. Using keyword 'value' to access the map's value column.
ALTER TABLE arctic_catalog.db.sample
ADD COLUMN points.value.b int;

可以通过添加 FIRSTAFTER 子句在任何位置添加列:

ALTER TABLE arctic_catalog.db.sample
ADD COLUMN new_column bigint AFTER other_column;
ALTER TABLEarctic_catalog.db.sample
ADD COLUMN nested.new_column bigint FIRST;

ALTER TABLE ... RENAME COLUMN

ALTER TABLE arctic_catalog.db.sample RENAME COLUMN data TO payload;

ALTER TABLE ... ALTER COLUMN

Alter COLUMN 可以用于加宽类型,使字段成为可选字段,设置注释和重新排序字段。

ALTER TABLE arctic_catalog.db.sample ALTER COLUMN measurement TYPE double;

若要从结构中添加或删除列,请使用带有嵌套列名的 ADD COLUMNDROP COLUMN

Column 注释也可以使用 ALTER COLUMN 更新:

ALTER TABLE arctic_catalog.db.sample ALTER COLUMN measurement TYPE double COMMENT 'unit is bytes per second';
ALTER TABLE arctic_catalog.db.sample ALTER COLUMN measurement COMMENT 'unit is kilobytes per second';

允许使用 FIRSTAFTER 子句对结构中的顶级列或列进行重新排序:

ALTER TABLE arctic_catalog.db.sample ALTER COLUMN col FIRST;
ALTER TABLE arctic_catalog.db.sample ALTER COLUMN nested.col AFTER other_col;

ALTER TABLE ... DROP COLUMN

ALTER TABLE arctic_catalog.db.sample DROP COLUMN id;
ALTER TABLE arctic_catalog.db.sample DROP COLUMN point.z;

ALTER TABLE ... DROP PARTITION

ALTER TABLE arctic_catalog.db.sample DROP IF EXISTS PARTITION (dt=2022);

DESC TABLE

DESCRIBE TABLE返回表的基本元数据信息。 对于有主键表,也会展示主键信息。

 { DESC | DESCRIBE }  TABLE  arctic_catalog.db.sample;