Bytehouse 云数仓版支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接进行通过Iceberg外表查询Iceberg中的数据。 从而提供了数据处理的灵活性和方便性。
外部表的功能旨在提供除ByteHouse内部表以外的其他数据的处理能力。通过一条简单的DDL语句,即可在ByteHouse上创建一张外部表,建立ByteHouse表与外部数据源的关联。
对于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操作类型有所限制:
|
Time Travel | 目前的实现方式是将版本信息藏在table名称中,即
采用当前ByteHouse支持的这种版本描述符的传入方式,那么
|
自动感知表结构变化 |
|
创建外表时,您需指定关联的外表库表信息,当前支持指定外表的列信息,或不指定列信息通过自动推导获取对应的列信息。
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 region='{region}', endpoint='{endpoint}', ak_id='{accessKey}', ak_secret='{accessSecretKey}',
参数 | 配置说明 |
---|---|
建表描述 | Iceberg表的列名和类型, 列类型映射规则见下文的 列类型映射 章节。 说明 指定列名和类型,以及分区键等描述时:
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
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) |
|
设置参数(SETTINGS) |
|
通过创建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 region='{region}', endpoint='{endpoint}', ak_id='{accessKey}', ak_secret='{accessSecretKey}', SETTINGS enable_schema_covert_fault_tolerance = 1;
参数 | 配置说明 |
---|---|
数据库描述 | 自定义外部数据库名称。 |
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
外表的查询和普通表的查询操作一致。
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表的元信息:
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 |