数据表

本文为您介绍数据湖构建中数据表的基本操作,包括内部表和外部表的区别及适用场景,帮助您根据实际需求选择合适的表类型并高效管理数据。

表类型介绍

对比维度

内部表

外部表

特性

采用湖格式Paimon表,支持实时与离线一体化存储,可通过计算引擎和开源API实现高效的表读写访问。

兼容Hive的格式表,支持CSV、JSON、Parquet、ORC等多种文件格式。

适用场景

流式处理、实时更新及高性能OLAP查询等场景。

需外部应用直接生成或消费数据的场景,如数据湖与外部系统的集成。

数据管理

数据由DLF完全管理,包括元数据和实际数据文件。

元数据由DLF管理,但实际数据文件存储在外部存储系统(如OSS)中,数据生命周期不受DLF控制。

存储系统

数据存储路径由DLF基于UUID自动生成,用户无需手动指定存储路径。

用户需手动指定外部存储路径,例如OSS的某个目录(如 oss://${bucket}/my_tables/)。

删除行为

删除表时,默认保留数据1天以降低误删风险,超过1天后数据会被彻底删除。

删除表时,仅清理元数据,外部存储系统中的实际数据文件保持不变,不会被删除。

说明

如果已经在其他平台上(如EMR、Flink等)关联了Catalog,也可在这些平台上创建数据库和表,元数据将会直接写入DLF中。详情请参见引擎对接

新建数据表

  1. 登录数据湖构建控制台

  2. Catalog列表页面,单击Catalog名称,进入Catalog详情页。

  3. 数据库列表中,单击数据库名称,进入表列表页。

  4. 表列表中,单击新建数据表

  5. 配置以下信息,单击确定

    配置项

    说明

    数据表名称

    必填,数据库下不可重名。

    数据表描述

    可选,输入描述信息。

    定义表中的列信息,包括列名称、是否为主键、是否非空、是否为分区字段、数据类型、长度/类型、描述及操作。

    表自定义属性

    • 内部表:可添加自定义属性,在表创建过程中会覆盖DLF元数据服务对应的默认参数,适用的配置项详见Paimon官方文档。详情请参见内部表

    • 外部表外部表需定义以下属性,详情请参见外部表

      • path:指定外部表路径。

      • type:指定为格式表,取值为format-table

      • file.format:指定文件格式。目前支持Parquet、ORC、CSVJSON格式。

内部表

内部表是由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表,并具备以下优势:

  1. 支持流式写入和流式读取,DLF后台会自动进行小文件合并,从而以较低的计算成本提升数据的时效性。

  2. 支持细粒度的数据操作,如 DELETEUPDATE 和 MERGE INTO,并提供版本管理和时间旅行功能,满足多样化的业务需求。

  3. 支持通过排序加速查询,也支持定义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
    );

查看版本历史

  1. 数据库列表中,单击数据库名称,可查看表列表。

  2. 表列表中,单击目标表名称,查看表字段信息。

  3. 单击版本历史页签,您可查看数据表的版本历史列表,包括:快照ID、提交时间、提交类型、表总行数、本次提交增加行数及schemaId。

    也可在查询框中输入快照ID、EARLIEST、LATEST,查看相应的快照版本信息。

外部表

外部表仅支持格式表,并需要指定外部存储路径。外部表是指数据生命周期和文件布局由其他方式管理的表,而非由DLF管理,因此表的生命周期和分区信息不会被DLF控制。目前,格式表支持Parquet、ORC、CSVJSON格式,并支持分区功能,同时能够映射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. 数据库列表中,单击数据库名称,可查看表列表。

  2. 表列表中,单击表名称,可查看表字段。

  3. 单击表详情页签,可查看数据表基本信息、字段列表及分区列表。

    如数据表名称、表类型、表格式、文件格式、存储位置、存储类型(可修改)、所属数据库、表描述、最近更新时间、创建人、Owner、最新更新人、创建时间、Table Properties及最新snapshot信息(Snapshot id、行数(物理)、引用文件个数、总文件大小、平均文件大小)等。

    说明

    表详情页签,您可以手动修改分区表和非分区表的存储类型。详情请参见手动修改存储类型

  4. 单击权限页签,可为用户或角色授予数据表相关权限。详情请参见授权管理

编辑数据表

  1. 数据库列表中,单击数据库名称,可查看表列表。

  2. 表列表中,单击操作列的编辑,进入编辑数据表页面。

  3. 您可对数据表描述、列信息、表自定义属性进行编辑。

  4. 单击更新,编辑完成。

删除数据表

重要
  • 内部表被删除后,系统默认将表内数据保留1天,以降低误删除风险。超过1天后,数据将被彻底删除。

  • 删除外部表时,仅会清理其元数据,OSS文件系统中的文件将保持不变,不会被删除。

  1. 数据库列表中,单击数据库名称,可查看表列表。

  2. 表列表中,单击操作列的删除

  3. 在弹出的提示框中,单击确定,完成数据表删除。