You need to enable JavaScript to run this app.
导航
Iceberg 外表
最近更新时间:2025.02.18 20:17:10首次发布时间:2025.02.18 20:17:10

Bytehouse 云数仓版支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接进行通过Iceberg外表查询Iceberg中的数据。 从而提供了数据处理的灵活性和方便性。

背景信息

费用说明

外部表的功能旨在提供除ByteHouse内部表以外的其他数据的处理能力。通过一条简单的DDL语句,即可在ByteHouse上创建一张外部表,建立ByteHouse表与外部数据源的关联。

  • 外部表在ByteHouse侧只会产生计算费用,遵循ByteHouse计算资源计费规则。
  • 使用外部表功能时,外部表的数据不会复制一份存在ByteHouse上并产生存储费用。存储费用请关注外部数据源存储侧计费规则。
  • 使用ByteHouse外部表访问外部数据源时,外部数据源可能会产生计算、访问、数据传输等费用,具体以外部数据源计费方式为准,请关注相应产品的说明。

Iceberg数据映射方式

对于Iceberg数据表,当前ByteHouse支持创建Iceberg外表创建Iceberg数据库两种方式实现ByteHouse与Iceberg的数据映射。

数据映射方式

数据映射说明

创建Iceberg外部表

在表维度建立ByteHouse表到Iceberg表的映射。源表schema变更不会直接同步,如果有变更,需删除ByteHouse中的外表重新创建一个外表。

创建Iceberg数据库

在Database维度建立 Bytehouse Database 到 Iceberg Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射,源表schema变更可直接同步至ByteHouse中。

使用限制

细分项

限制说明

Schema Evolution

Bytehouse 支持查询存在Schema Evolution的表,但对源表的schema操作类型有所限制:

  • 支持的源表操作:新增列、删除列、修改列类型,ByteHouse可正常查询
  • 不支持的操作:修改列名,ByteHouse查询会报错

Time Travel

目前的实现方式是将版本信息藏在table名称中,即tbl$version$<identifier>。当前并不支持iceberg原生支持的其他多种类型的版本描述符,比如:

  • 时间戳(字符串,例如2024-12-01)
  • snapshotId(整数)
  • 分支名或者tag名,可以是任意的string内容

采用当前ByteHouse支持的这种版本描述符的传入方式,那么<identifer>只能是:

  • snapshotId(整数)
  • 符合标识符命名规则的字符串

自动感知表结构变化

  • Database方式:可以自动感知表结构变化,以及增加删除表
  • Table方式:可以自动感知表结构变化

创建Iceberg外部表

创建外表时,您需指定关联的外表库表信息,当前支持指定外表的列信息,或不指定列信息通过自动推导获取对应的列信息。

  • 指定列信息:要求所有指定的列名,在对应的Iceberg表中都存在,并且类型等价或者兼容,否则会报错。
  • 不指定列信息,自动推导对应的列信息:可以通过enable_schema_covert_fault_tolerance参数控制自动推导类型不存在的处理方式,当Iceberg中的类型无法在 Bytehouse中找到兼容类型时:取值1表示忽略;0表示报错;默认值是1

Iceberg 的数据可以存放在不同的文件系统上,例如HDFS、S3。下面具体介绍不同文件系统上的建表语句:

Iceberg on HDFS

手动指定列信息

CREATE TABLE `{tableName}` (
    `col_boolean` BOOLEAN,
    `col_integer` Int32,
    `col_long` Int64,
    `col_float` Float32,
    `col_double` Float64,
    `col_decimal` DECIMAL(10, 2),
    `col_date` DATE32,
    `col_timestamp` DateTime64(3),
    `col_uuid` UUID,
    `col_string` String,
    `col_fixed` FixedString(50),
    `col_binary` String,
    `col_list_integer` Array(Int32),
    `col_map` Map(String, Int32),
    `col_struct` Tuple(`field_integer` Int32, `field_string` String, `field_timestamp` DateTime64(3), `field_decimal` DECIMAL(28, 6), `field_binary` String)
) 
ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}');

参数

配置说明

建表描述

Iceberg表的列名和类型, 列类型映射规则见下文的 列类型映射 章节。

说明

指定列名和类型,以及分区键等描述时:

  • 列名需要与Iceberg表一一对应;列的顺序不需要一一对应
  • 创建外表时,外表列可以只选择Iceberg表中的部分列,但分区列必须要全部包含。
  • 外表列的分区需要通过partition by语句指定,同时需要与普通列一样定义到描述列表中。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:hdfs://haruna/home/byte_flink_test/table_store/bytehouse_test

    注意

    这里填写的是Iceberg的顶层目录

  • IcebergDatabaseName:指定Iceberg中的数据库。
  • IcebergTableName:指定Iceberg中的表。

自动推导列信息

CREATE TABLE `{tableName}`
ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}')
SETTINGS enable_schema_covert_fault_tolerance = 1;

参数

配置说明

建表描述

Iceberg表的列名和类型,以及 Partition By key,将会在建表的时候自动推导建立列类型映射规则见下文的 列类型映射 章节。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:hdfs://haruna/home/byte_flink_test/table_store/bytehouse_test

    注意

    这里填写的是Iceberg的顶层目录

  • IcebergDatabaseName:指定Iceberg中的数据库。
  • IcebergTableName:指定Iceberg中的表。

设置参数(SETTINGS)

enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
当Iceberg中的类型无法在 Bytehouse中找到兼容类型时:取值1表示忽略;0表示报错;

  • 默认值是1
  • 当设置成0时,那些存在类型兼容问题的Table将无法展示出来。

Iceberg on S3(TOS)

手动指定列信息

CREATE TABLE `{tableName}` (
    `col_boolean` BOOLEAN,
    `col_integer` Int32,
    `col_long` Int64,
    `col_float` Float32,
    `col_double` Float64,
    `col_decimal` DECIMAL(10, 2),
    `col_date` DATE32,
    `col_timestamp` DateTime64(3),
    `col_uuid` UUID,
    `col_string` String,
    `col_fixed` FixedString(50),
    `col_binary` String,
    `col_list_integer` Array(Int32),
    `col_map` Map(String, Int32),
    `col_struct` Tuple(`field_integer` Int32, `field_string` String, `field_timestamp` DateTime64(3), `field_decimal` DECIMAL(28, 6), `field_binary` String)
) 
ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}')
SETTINGS region='{region}', 
endpoint='{endpoint}', 
ak_id='{accessKey}', 
ak_secret='{accessSecretKey}',

参数

配置说明

建表描述

Iceberg表的列名和类型, 列类型映射规则见下文的 列类型映射 章节。

说明

指定列名和类型,以及分区键等描述时:

  • 列名需要与Iceberg表一一对应;列的顺序不需要一一对应
  • 创建外表时,外表列可以只选择Iceberg表中的部分列,但分区列必须要全部包含。
  • 外表列的分区需要通过partition by语句指定,同时需要与普通列一样定义到描述列表中。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:tos://test-dev-hcf/iceberg

    注意

    • 这里填写的是Iceberg的顶层目录。
    • 如果Iceberg的数据存储文件系统是火山引擎TOS,此处可配置为tos://开头或s3://开头的域名。
      例如,外部数据源的存储路径复制后为:bhlasinfo/Iceberg
      Image
      则,拼接后待配置的地址可以是:tos://bhlasinfo/Icebergs3://bhlasinfo/Iceberg
  • IcebergDatabaseName:指定Iceberg中的数据库。
  • IcebergTableName:指定Iceberg中的表。

设置参数(SETTINGS)

  • Region : 外部数据源服务地域,例如,cn-beijing
  • Endpoint: 外部数据源的连接地址,例如,tos-s3-cn-beijing.volces.com

    注意

    您可以前往TOS控制台查看对应的S3 endpoint。
    Image

  • ak_id/ak_secrent,具有S3访问权限的密钥。

自动推导列信息

CREATE TABLE `{tableName}` 
ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}')
SETTINGS region='{region}', 
endpoint='{endpoint}', 
ak_id='{accessKey}', 
ak_secret='{accessSecretKey}',
enable_schema_covert_fault_tolerance = 1;

参数

配置说明

建表描述

自定义外部数据表名称。Iceberg表的列名和类型,以及 Partition By key,将会在建表的时候自动推导建立。列类型映射规则见下文的 列类型映射 章节。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:tos://test-dev-hcf/iceberg

    注意

    • 这里填写的是iceberg的顶层目录。
    • 如果Iceberg的数据存储文件系统是火山引擎TOS,此处可配置为tos://开头或s3://开头的域名。
      例如,外部数据源的存储路径复制后为:bhlasinfo/Iceberg
      Image
      则,拼接后待配置的地址可以是:tos://bhlasinfo/Icebergs3://bhlasinfo/Iceberg
  • IcebergDatabaseName:指定Iceberg中的数据库。

设置参数(SETTINGS)

  • enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
    当Iceberg中的类型无法在 Bytehouse中找到兼容类型时:取值1表示忽略;0表示报错;
    • 默认值是1
    • 当设置成0时,那些存在类型兼容问题的Table将无法展示出来。
  • Region : 外部数据源服务地域,例如,cn-beijing
  • Endpoint: 外部数据源的连接地址,例如,tos-s3-cn-beijing.volces.com

    注意

    您可以前往TOS控制台查看对应的S3 endpoint。
    Image

  • ak_id/ak_secrent,具有 S3 访问权限的密钥。

创建Iceberg外部数据库

通过创建ByteHouse外部数据库,在Database维度建立 Bytehouse Database 到 Iceberg Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射。
Iceberg 的数据可以存放在不同的文件系统上,例如HDFS、S3。下面具体介绍不同文件系统上的建表语句:

Iceberg on HDFS

CREATE DATABASE test_iceberg_db_hdfs
engine = Iceberg('hadoop', '{warehouse}', '{icebergDatabaseName}')
SETTINGS enable_schema_covert_fault_tolerance = 1;

参数

配置说明

数据库描述

自定义外部数据库名称。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:hdfs://haruna/home/byte_flink_test/table_store/bytehouse_test

    注意

    这里填写的是Iceberg的顶层目录

  • IcebergDatabaseName:指定Iceberg中的数据库。

设置参数(SETTINGS)

enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
当Iceberg中的类型无法在 Bytehouse中找到兼容类型时:取值1表示忽略;0表示报错;

  • 默认值是1
  • 当设置成0时,那些存在类型兼容问题的Table将无法展示出来。

Iceberg on S3

CREATE DATABASE {databaseName}
engine = Iceberg('hadoop', '{warehouse}', '{icebergDatabaseName}')
SETTINGS region='{region}', 
endpoint='{endpoint}', 
ak_id='{accessKey}', 
ak_secret='{accessSecretKey}',
SETTINGS enable_schema_covert_fault_tolerance = 1; 

参数

配置说明

数据库描述

自定义外部数据库名称。

引擎参数(Engine)

  • hadoop:固定配置为hadoop。
  • warehouse:配置为Iceberg的数仓连接的地址,例如:tos://test-dev-hcf/iceberg

    注意

    • 这里填写的是Iceberg的顶层目录。
    • 如果Iceberg的数据存储文件系统是火山引擎TOS,此处可配置为tos://开头或s3://开头的域名。
      例如,外部数据源的存储路径复制后为:bhlasinfo/Iceberg
      Image
      则,拼接后待配置的地址可以是:tos://bhlasinfo/Icebergs3://bhlasinfo/Iceberg
  • IcebergDatabaseName:指定Iceberg中的数据库。

设置参数(SETTINGS)

  • enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
    当Iceberg中的类型无法在 Bytehouse中找到兼容类型时:取值1表示忽略;0表示报错;
    • 默认值是1
    • 当设置成0时,那些存在类型兼容问题的Table将无法展示出来。
  • Region : 外部数据源服务地域,例如,cn-beijing
  • Endpoint: 外部数据源的连接地址,例如,tos-s3-cn-beijing.volces.com

    注意

    您可以前往TOS控制台查看对应的S3 endpoint。
    Image

  • ak_id/ak_secrent,具有 S3 访问权限的密钥。

查询外部表

外表的查询和普通表的查询操作一致。

  • 通用方式
    select * from  t where xxx;
    

删除外部库表

外部库表的删除操作和普通表的删除操作一致。

  • 删除外部数据库。

    注意

    删除外部数据库后,外部数据库下的所有外部表也将同时被删除,请谨慎操作。

    DROP DATABASE example_db
    
  • 删除外部数据表。

    DROP TABLE example_table
    

快照查询
-- 指定snapshotId=123456789
select * from tbl$version$123456789;

-- 指定branch名称=branch_1
select * from tbl$version$branch_1;

-- 指定tag名称=tag_1
select * from tbl$version$branch_1;

查询表的元信息

以下为当前支持查询的所有Iceberg表的元信息:

  • snapshots:记录数据集的所有快照信息,用于追踪和恢复数据的历史版本。
  • refs:包含指向快照的引用(分支和标签),支持并行开发和标记重要版本。
  • history:记录数据集的变更历史,帮助审计和回溯数据的变化。
  • files:提供数据集中实际物理存储的数据文件的相关信息,便于数据管理和性能优化。
  • properties:Schema相关的配置属性。
select * from tbl$metadata$snapshots;
select * from tbl$metadata$refs;
select * from tbl$metadata$history;
select * from tbl$metadata$files;
select * from tbl$metadata$properties;

参考:数据类型映射

Iceberg 类型

Bytehouse 类型

Boolean

UInt8

Integer

Int32

Long

Int64

Float

Float32

Double

Float64

Date

Date32

Time

不支持

Timestamp

DateTime64(UTC)

String

String

UUID

UUID

Fixed

FixedString

Binary

String

Decimal

Deciaml

Struct

Tuple

List

Array

Map

Map