ByteHouse 云数仓版支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接进行通过 Iceberg 外表查询 Iceberg 中的数据, 从而提供了数据处理的灵活性和方便性。本文将介绍如何在 ByteHouse 中使用 Iceberg 外表。
对于 Iceberg 数据表,当前 ByteHouse 支持创建 Iceberg 外表、创建 Iceberg 外部数据库、创建 Iceberg 外部 Catalog 三种方式实现 ByteHouse 与 Iceberg 的数据映射。
数据映射方式 | 数据映射说明 |
|---|---|
创建 Iceberg 外部表 | 在表(Table)维度建立 ByteHouse 表到 Iceberg 表的映射。源表 schema 变更不会直接同步,如果有变更,需删除 ByteHouse 中的外表重新创建一个外表。 |
创建 Iceberg 外部数据库 | 在数据库(Database)维度建立 ByteHouse Database 到 Iceberg Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射,源表 schema 变更可直接同步至 ByteHouse 中。 |
创建 Iceberg 外部 Catalog | 在数据目录(Catalog)唯独建立 ByteHouse Catalog 到 Iceberg Catalog 的映射。建立 Catalog 映射之后不需要再手动建立库、表映射,可自动同步 Catalog 下的库、表映射,可以感知 Iceberg 库、表的新增和删除,源表 schema 变更可直接同步至 ByteHouse 中。创建 Iceberg 外部 Catalog 的操作详情请参见 Iceberg Catalog。 |
外部表的功能旨在提供除 ByteHouse 内部表以外的其他数据的处理能力。通过一条简单的 DDL 语句,即可在 ByteHouse 上创建一张外部表,建立 ByteHouse 表与外部数据源的关联。
细分项 | 限制说明 |
|---|---|
Schema Evolution | ByteHouse 支持查询存在 Schema Evolution 的表,但对源表的 schema 操作类型有所限制:
|
Time Travel | 目前的实现方式是将版本信息藏在 table 名称中,即
采用当前 ByteHouse 支持的这种版本描述符的传入方式,那么
|
自动感知表结构变化 |
|
通过创建 ByteHouse 外部数据库,在 Database 维度建立 ByteHouse Database 到 Iceberg Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射。
Iceberg 的数据可以存放在不同的文件系统上,例如 HDFS、S3。下面具体介绍不同文件系统上的建表语句:
CREATE DATABASE test_iceberg_db_hdfs ENGINE = Iceberg('hadoop', '{warehouse}', '{icebergDatabaseName}') SETTINGS enable_schema_covert_fault_tolerance = 1;
参数 | 配置说明 |
|---|---|
数据库描述 | 自定义外部数据库名称。 |
引擎参数(Engine) |
|
设置参数(SETTINGS) | enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
|
CREATE DATABASE {databaseName} ENGINE = Iceberg('hadoop', '{warehouse}', '{icebergDatabaseName}') SETTINGS endpoint='{endpoint}', ak_id='{accessKey}', ak_secret='{accessSecretKey}', s3_extra_options='s3.paging.maximum=1000';
参数 | 配置说明 |
|---|---|
数据库描述 | 自定义外部数据库名称。 |
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
S3 参数设置 | s3_extra_options:可选参数,用于设置 S3 调优参数,您可参考以下格式设置调优参数:
|
创建外表时,您需指定关联的外表库表信息,当前支持指定外表的列信息,或不指定列信息通过自动推导获取对应的列信息。
enable_schema_covert_fault_tolerance 参数控制自动推导类型不存在的处理方式,当 Iceberg 中的类型无法在 ByteHouse 中找到兼容类型时:取值 1 表示忽略;0 表示报错;默认值是 1。Iceberg 的数据可以存放在不同的文件系统上,例如 HDFS、S3。下面具体介绍不同文件系统上的建表语句:
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 表的列名和类型, 列类型映射规则见下文的 列类型映射 章节。 说明 指定列名和类型,以及分区键等描述时:
|
引擎参数(Engine) |
|
CREATE TABLE `{tableName}` ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}') SETTINGS enable_schema_covert_fault_tolerance = 1;
参数 | 配置说明 |
|---|---|
建表描述 | Iceberg 表的列名和类型,以及 Partition By key,将会在建表的时候自动推导建立列类型映射规则见下文的 列类型映射 章节。 |
引擎参数(Engine) |
|
设置参数(SETTINGS) | enable_schema_covert_fault_tolerance:控制自动推导类型不存在的处理方式。
|
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 endpoint='{endpoint}', ak_id='{accessKey}', ak_secret='{accessSecretKey}', s3_extra_options='s3.paging.maximum=1000';
参数 | 配置说明 |
|---|---|
建表描述 | Iceberg 表的列名和类型, 列类型映射规则见下文的 列类型映射 章节。 说明 指定列名和类型,以及分区键等描述时:
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
S3 参数设置 | s3_extra_options:可选参数,用于设置 S3 调优参数,您可参考以下格式设置调优参数:
|
CREATE TABLE `{tableName}` ENGINE = CnchIceberg('hadoop', '{warehouse}', '{icebergDatabaseName}', '{icebergTableName}') SETTINGS endpoint='{endpoint}', ak_id='{accessKey}', ak_secret='{accessSecretKey}', s3_extra_options='s3.paging.maximum=1000';
参数 | 配置说明 |
|---|---|
建表描述 | 自定义外部数据表名称。Iceberg 表的列名和类型,以及 Partition By key,将会在建表的时候自动推导建立。列类型映射规则见下文的 列类型映射 章节。 |
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
S3 参数设置 | s3_extra_options:可选参数,用于设置 S3 调优参数,您可参考以下格式设置调优参数:
|
您可使用 INSERT INTO 或 INSERT OVERWRITE 方式写入外部表。
您可以使用基础的 INSERT INTO 语句写入数据。
# 方式 1 INSERT INTO database.table VALUES (val1, val2, ...), (val1, val2, ...), ...; # 方式 2 INSERT INTO database.table SELECT [col1, col2, ... | *] FROM source_db.source_table;
参数 | 配置说明 |
|---|---|
数据库及表描述 | database.table:指定需查询的数据库和表名称。如果您在执行该语句前,已执行 |
写入参数描述 |
|
该语句的功能是重写表。
# 方式 1 INSERT OVERWRITE database.table VALUES (val1, val2, ...), (val1, val2, ...), ...; # 方式 2 INSERT OVERWRITE database.table SELECT [col1, col2, ... | *] FROM source_db.source_table;
参数 | 配置说明 |
|---|---|
数据库及表描述 | database.table:指定需查询的数据库和表名称。如果您在执行该语句前,已执行 |
写入参数描述 |
|
外表的查询和普通表的查询操作一致。
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$tag_1;
以下为当前支持查询的所有 Iceberg 表的元信息:
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 |