Apache Paimon 使用之 Creating Table

1.创建 Catalog 管理的 Tables

在Paimon Catalog中创建的Tables由Catalog管理,当Tables从Catalog中删除时,其table files也将被删除。

当使用Paimon Catalog,创建一个名为MyTable的managed table,在Catalog的default数据库中有五列,其中dthhuser_id是primary keys。

Flink 引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
);

Spark3引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);

Hive引擎

SET hive.metastore.warehouse.dir=warehouse_path;

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
)
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);

注意:在删除表之前,应停止在表上的插入Job,否则无法完全删除表文件。

I)分区表

创建一个名为MyTable的表,其中dthh是分区列,dthhuser_id是主键。

Flink引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
) PARTITIONED BY (dt, hh);

Spark3引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
) PARTITIONED BY (dt, hh) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);

Hive引擎

SET hive.metastore.warehouse.dir=warehouse_path;

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING
) PARTITIONED BY ( 
    dt STRING,
    hh STRING
)
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);

注意:通过配置partition.expiration-time,可以自动删除过期的分区。

ii)选择分区字段

以下三种类型的字段可以定义为数仓中的分区字段:

  • Creation Time(推荐):创建时间通常是不可变的,因此可以将其视为分区字段并将其添加到主键中。
  • Event Time:事件时间是原始表中的一个字段,对于CDC数据,例如从MySQL CDC同步的表或Paimon生成的Changelogs,都是完整的CDC数据,包括UPDATE_BEFORE Records,即使声明了包含主键的分区字段,也可以实现唯一性(需要'changelog-producer'='input'
  • CDC op_ts:它不能被定义为分区字段,无法知道以前的record timestamp。
iii)指定统计模式

Paimon将自动收集数据文件的统计数据,以加快查询过程。支持四种模式:

  • full:收集完整的指标:null_count, min, max
  • truncate(length):长度可以是任何正数,默认模式是truncate(16)这意味着收集空数,最小/最大值,截断长度为16。主要是为了避免过大的列会放大清单文件。
  • counts:只收集空计数。
  • none:禁用元数据统计信息收集。

统计收集器模式可以通过'metadata.stats-mode'配置,默认为'truncate(16)',可以通过设置'fields.{field_name}.stats-mode'来配置字段级别。

iiii)字段默认值

Paimon表目前支持为表属性中的字段设置默认值,请注意,无法指定分区字段和主键字段。

Flink引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
) PARTITIONED BY (dt, hh)
with(
    'fields.item_id.default-value'='0'
);

Spark3引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
) PARTITIONED BY (dt, hh) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id',
    'fields.item_id.default-value'='0'
);

Hive引擎

SET hive.metastore.warehouse.dir=warehouse_path;

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
)
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id',
    'partition'='dt,hh',
    'fields.item_id.default-value'='0'
);
2.Create Table As

表可以通过查询结果创建,例如CREATE TABLE table_b AS SELECT id, name FORM table_a,生成的表 table_b 将等同于创建表并插入带有以下语句的数据:CREATE TABLE table_b (id INT, name STRING); INSERT INTO table_b SELECT id, name FROM table_a;

当使用CREATE TABLE AS SELECT,可以指定主键或分区。

Flink 引擎

/* For streaming mode, you need to enable the checkpoint. */

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT
);
CREATE TABLE MyTableAs AS SELECT * FROM MyTable;

/* partitioned table */
CREATE TABLE MyTablePartition (
     user_id BIGINT,
     item_id BIGINT,
     behavior STRING,
     dt STRING,
     hh STRING
) PARTITIONED BY (dt, hh);
CREATE TABLE MyTablePartitionAs WITH ('partition' = 'dt') AS SELECT * FROM MyTablePartition;
    
/* change options */
CREATE TABLE MyTableOptions (
       user_id BIGINT,
       item_id BIGINT
) WITH ('file.format' = 'orc');
CREATE TABLE MyTableOptionsAs WITH ('file.format' = 'parquet') AS SELECT * FROM MyTableOptions;

/* primary key */
CREATE TABLE MyTablePk (
      user_id BIGINT,
      item_id BIGINT,
      behavior STRING,
      dt STRING,
      hh STRING,
      PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
);
CREATE TABLE MyTablePkAs WITH ('primary-key' = 'dt,hh') AS SELECT * FROM MyTablePk;


/* primary key + partition */
CREATE TABLE MyTableAll (
      user_id BIGINT,
      item_id BIGINT,
      behavior STRING,
      dt STRING,
      hh STRING,
      PRIMARY KEY (dt, hh, user_id) NOT ENFORCED 
) PARTITIONED BY (dt, hh);
CREATE TABLE MyTableAllAs WITH ('primary-key' = 'dt,hh', 'partition' = 'dt') AS SELECT * FROM MyTableAll;

Spark3引擎

CREATE TABLE MyTable (
     user_id BIGINT,
     item_id BIGINT
);
CREATE TABLE MyTableAs AS SELECT * FROM MyTable;

/* partitioned table*/
CREATE TABLE MyTablePartition (
      user_id BIGINT,
      item_id BIGINT,
      behavior STRING,
      dt STRING,
      hh STRING
) PARTITIONED BY (dt, hh);
CREATE TABLE MyTablePartitionAs PARTITIONED BY (dt) AS SELECT * FROM MyTablePartition;

/* change TBLPROPERTIES */
CREATE TABLE MyTableOptions (
       user_id BIGINT,
       item_id BIGINT
) TBLPROPERTIES ('file.format' = 'orc');
CREATE TABLE MyTableOptionsAs TBLPROPERTIES ('file.format' = 'parquet') AS SELECT * FROM MyTableOptions;


/* primary key */
CREATE TABLE MyTablePk (
     user_id BIGINT,
     item_id BIGINT,
     behavior STRING,
     dt STRING,
     hh STRING
) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);
CREATE TABLE MyTablePkAs TBLPROPERTIES ('primary-key' = 'dt') AS SELECT * FROM MyTablePk;

/* primary key + partition */
CREATE TABLE MyTableAll (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
) PARTITIONED BY (dt, hh) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id'
);
CREATE TABLE MyTableAllAs PARTITIONED BY (dt) TBLPROPERTIES ('primary-key' = 'dt,hh') AS SELECT * FROM MyTableAll;
i)Create Table Like

要创建与另一个表相同的schema、分区和表属性的表,请使用CREATE TABLE LIKE。

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
);

CREATE TABLE MyTableLike LIKE MyTable;

-- Create Paimon Table like other connector table
CREATE TABLE MyTableLike WITH ('connector' = 'paimon') LIKE MyTable;
ii)Table Properties

可以指定表属性来启用功能或提高Paimon的性能。

以下SQL创建一个名为MyTable的表,其五列由dthh分区,其中dthhuser_id是主键,此表有两个属性:'bucket' = '2''bucket-key' = 'user_id'

Flink引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
) PARTITIONED BY (dt, hh) WITH (
    'bucket' = '2',
    'bucket-key' = 'user_id'
);

Spark引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
) PARTITIONED BY (dt, hh) TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id',
    'bucket' = '2',
    'bucket-key' = 'user_id'
);

Hive引擎

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING
)
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
TBLPROPERTIES (
    'primary-key' = 'dt,hh,user_id',
    'partition'='dt,hh',
    'bucket' = '2',
    'bucket-key' = 'user_id'
);
3.Creating External Tables

外部表被记录,但不由catalog管理,如果外部表被删除,其表文件不会被删除。

Paimon外部表可以在任何catalog中使用,如果不想创建Paimon Catalog,只想读/写Table,可以考虑创建外部表。

注意:如果表已经存在,options 不会像dynamic options一样更新到表的metadata中。

Flink引擎-已弃用,建议使用Paimon Catalog

Flink SQL支持读取和写入外部表,外部Paimon表是通过指定connectorpath表属性创建的,以下SQL创建了一个名为MyTable的外部表,有五列,其中表文件的基本路径是hdfs:///path/to/table

CREATE TABLE MyTable (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    dt STRING,
    hh STRING,
    PRIMARY KEY (dt, hh, user_id) NOT ENFORCED
) WITH (
    'connector' = 'paimon',
    'path' = 'hdfs:///path/to/table',
    'auto-create' = 'true' -- this table property creates table files for an empty table if table path does not exist
                           -- currently only supported by Flink
);

注意:Flink SQL必须声明所有字段。

Spark引擎

Spark3仅支持通过Scala API创建外部表,以下Scala代码将位于hdfs:///path/to/table的表加载到DataSet

val dataset = spark.read.format("paimon").load("hdfs:///path/to/table")

Hive引擎

要访问现有的paimon表,可以在Hive中将它们注册为外部表,以下SQL创建了一个名为my_table的外部表,其中表文件的基本路径是hdfs:///path/to/table,由于schema存储在表文件中,所以用户无需定义列。

CREATE EXTERNAL TABLE my_table
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
LOCATION 'hdfs:///path/to/table';
4.Creating Temporary Tables

临时表仅支持Flink引擎,与外部表一样,临时表只是记录,但不由当前的Flink SQL session管理。

如果临时表被删除,其resources将不会被删除,当Flink SQL session关闭时,临时表会被丢弃。

如果想将Paimon Catalog与其它表一起使用,但不想将它们存储在其它Catalog中,可以创建一个临时表。

以下Flink SQL创建了一个Paimon Catalog和一个临时表:

CREATE CATALOG my_catalog WITH (
    'type' = 'paimon',
    'warehouse' = 'hdfs:///path/to/warehouse'
);

USE CATALOG my_catalog;

-- Assume that there is already a table named my_table in my_catalog

CREATE TEMPORARY TABLE temp_table (
    k INT,
    v STRING
) WITH (
    'connector' = 'filesystem',
    'path' = 'hdfs:///path/to/temp_table.csv',
    'format' = 'csv'
);

SELECT my_table.k, my_table.v, temp_table.v FROM my_table JOIN temp_table ON my_table.k = temp_table.k;
相关推荐
榆落同学7 小时前
通过Apache、Nginx限制直接访问public下的静态文件
运维·nginx·apache
佚名猫16 小时前
Apache JMeter 压力测试使用说明
jmeter·apache·压力测试
IT古董19 小时前
【权限管理】Apache Shiro学习教程
java·apache·shiro·权限
檀越剑指大厂1 天前
【Java基础】使用Apache POI和Spring Boot实现Excel文件上传和解析功能
java·spring boot·apache
长风清留扬2 天前
小程序安全机制与隐私保护策略探讨
javascript·css·微信小程序·小程序·apache·html5
田振靓2 天前
Ubuntu上安装Apache Spark
ubuntu·spark·apache
JermeryBesian2 天前
Flink概念知识讲解之:Restart重启策略配置
java·flink·apache
Luke~~3 天前
Apache Paimon-实时数据湖
apache
胡萝卜的兔3 天前
thinnkphp5.1和 thinkphp6以及nginx,apache 解决跨域问题
运维·nginx·apache·thinkphp
癞皮狗不赖皮3 天前
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
网络安全·apache·中间件安全