本文为您介绍数据湖构建中数据表的基本操作,包括内部表和外部表的区别及适用场景,帮助您根据实际需求选择合适的表类型并高效管理数据。
表类型介绍
对比维度 | ||
特性 | 采用湖格式Paimon表,支持实时与离线一体化存储,可通过计算引擎和开源API实现高效的表读写访问。 | 兼容Hive的格式表,支持CSV、JSON、Parquet、ORC等多种文件格式。 |
适用场景 | 流式处理、实时更新及高性能OLAP查询等场景。 | 需外部应用直接生成或消费数据的场景,如数据湖与外部系统的集成。 |
数据管理 | 数据由DLF完全管理,包括元数据和实际数据文件。 | 元数据由DLF管理,但实际数据文件存储在外部存储系统(如OSS)中,数据生命周期不受DLF控制。 |
存储系统 | 数据存储路径由DLF基于UUID自动生成,用户无需手动指定存储路径。 | 用户需手动指定外部存储路径,例如OSS的某个目录(如 |
删除行为 | 删除表时,默认保留数据1天以降低误删风险,超过1天后数据会被彻底删除。 | 删除表时,仅清理元数据,外部存储系统中的实际数据文件保持不变,不会被删除。 |
如果已经在其他平台上(如EMR、Flink等)关联了Catalog,也可在这些平台上创建数据库和表,元数据将会直接写入DLF中。详情请参见引擎对接。
新建数据表
登录数据湖构建控制台。
在Catalog列表页面,单击Catalog名称,进入Catalog详情页。
在数据库列表中,单击数据库名称,进入表列表页。
在表列表中,单击新建数据表。
配置以下信息,单击确定。
配置项
说明
数据表名称
必填,数据库下不可重名。
数据表描述
可选,输入描述信息。
列
定义表中的列信息,包括列名称、是否为主键、是否非空、是否为分区字段、数据类型、长度/类型、描述及操作。
表自定义属性
内部表:可添加自定义属性,在表创建过程中会覆盖DLF元数据服务对应的默认参数,适用的配置项详见Paimon官方文档。详情请参见内部表。
外部表:外部表需定义以下属性,详情请参见外部表。
path
:指定外部表路径。type
:指定为格式表,取值为format-table
。file.format
:指定文件格式。目前支持Parquet、ORC、CSV和JSON格式。
内部表
内部表是由DLF管理的Paimon表,DLF会自动生成基于UUID的存储路径,并在后台自动进行表优化与维护,您只需专注于业务逻辑即可。内部表支持主键表和Append表。
全托管Paimon表提供如下特性:
全托管Compaction,与数据写入完全分离,运行更稳定。
支持多个写入作业同时写入同一张表的同一个分区。
提供分区级实时指标,行数、文件个数、大小等。
提供多版本机制,支持时间旅行,细粒度的增删改操作。
在DLF中创建的Paimon表默认采用“write-only”模式,这意味着后台的表优化操作(如Compaction、快照清理、分区清理等)将由DLF后台自动完成。
DLF会为元数据服务提供一些默认参数,帮助您更高效地进行数据存储与计算。如果需要,您也可以通过配置自定义属性来覆盖这些默认参数,以满足特定需求。
主键表
主键表是一种支持流式更新的表类型,允许对表中的记录进行实时更新,并生成主键表的变更日志以供流式读取。主键由一组列组成,这些列的值唯一标识每条记录。主键表更推荐应用于流式场景中。Paimon采用LSM树(日志结构合并树)作为底层文件存储的数据结构,这是Paimon流式更新强大的关键。此外,Paimon支持用户对主键字段应用过滤条件来实现高性能查询,满足实时分析和处理的需求。
Flink SQL示例
CREATE TABLE orders ( order_id BIGINT, price BIGINT, customer STRING, PRIMARY KEY NOT ENFORCED(order_id) );
Spark SQL示例
CREATE TABLE orders ( order_id BIGINT, price BIGINT, customer STRING ) TBLPROPERTIES ( 'primary-key' = 'order_id' );
DLF产品默认采用Postpone Bucket模式,这是一种自适应的桶分配策略。该模式能够根据分区的数据量动态调整桶的数量,从而避免因桶配置过多导致读取性能下降,或因桶配置过少影响写入性能。通过这种智能化的机制,您无需担心桶的配置问题。当然,如果您有特殊需求,也可以主动设置桶数(如 'bucket' = '5')以覆盖默认配置。
其它业务相关的配置,您可以定义:
合并引擎(merge-engine)来进行较为复杂的计算。
删除向量(deletion-vectors.enabled)来大幅提升查询性能。
变更日志(changelog-producer)为 'lookup' 来生成变更日志以提供给下游流读。
序列字段(sequence.field)来面对有乱序的场景,以获得正确更新顺序。
如果上游是CDC数据,推荐使用Flink CDC或者数据集成产品来完成数据更新入湖,获得整库同步、自动建表、表结构同步等能力。
如果希望主键表在OLAP引擎中实现高性能查询,我们高度推荐开启“删除向量”模式,虽然会消耗多一些Compaction的资源,带来的是更稳定和更高性能的OLAP查询。
Append表
如果一个表未定义主键,则它被称为Append表。与主键表不同,Append表不支持直接的流式更新,但它的批处理性能要出众得多。Append表可以很好地替代传统的Hive表,并具备以下优势:
支持流式写入和流式读取,DLF后台会自动进行小文件合并,从而以较低的计算成本提升数据的时效性。
支持细粒度的数据操作,如
DELETE
、UPDATE
和MERGE INTO
,并提供版本管理和时间旅行功能,满足多样化的业务需求。支持通过排序加速查询,也支持定义Bitmap来进行加速查询,OLAP引擎有很好的直读性能。
我们推荐在绝大多数批处理场景中,或无主键的流处理场景下使用Append表。相比主键表,Append表更简单易用,同时能够满足高效数据写入和查询的需求。
Flink SQL示例
CREATE TABLE orders ( order_id BIGINT, price BIGINT, customer STRING );
Spark SQL示例
CREATE TABLE orders ( order_id BIGINT, price BIGINT, customer STRING );
查看版本历史
在数据库列表中,单击数据库名称,可查看表列表。
在表列表中,单击目标表名称,查看表字段信息。
单击版本历史页签,您可查看数据表的版本历史列表,包括:快照ID、提交时间、提交类型、表总行数、本次提交增加行数及schemaId。
也可在查询框中输入快照ID、EARLIEST、LATEST,查看相应的快照版本信息。
外部表
外部表仅支持格式表,并需要指定外部存储路径。外部表是指数据生命周期和文件布局由其他方式管理的表,而非由DLF管理,因此表的生命周期和分区信息不会被DLF控制。目前,格式表支持Parquet、ORC、CSV和JSON格式,并支持分区功能,同时能够映射Hive表的格式。
Flink SQL示例
CREATE TABLE my_csv_table ( a INT, b STRING ) WITH ( 'type'='format-table', 'path' = 'oss://${bucket}/my_tables/my_csv_table' 'file.format'='csv' );
Flink OSS权限适配,请参见配置Bucket鉴权信息。
Spark SQL示例
CREATE TABLE my_csv_table ( a INT, b STRING ) USING CSV OPTIONS ( 'path'='oss://${bucket}/my_tables/my_csv_table' )
查看数据表
编辑数据表
在数据库列表中,单击数据库名称,可查看表列表。
在表列表中,单击操作列的编辑,进入编辑数据表页面。
您可对数据表描述、列信息、表自定义属性进行编辑。
单击更新,编辑完成。
删除数据表
内部表被删除后,系统默认将表内数据保留1天,以降低误删除风险。超过1天后,数据将被彻底删除。
删除外部表时,仅会清理其元数据,OSS文件系统中的文件将保持不变,不会被删除。
在数据库列表中,单击数据库名称,可查看表列表。
在表列表中,单击操作列的删除。
在弹出的提示框中,单击确定,完成数据表删除。