CnchHive 为 ByteHouse 团队提供的一种表引擎,支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接查询 Hive 外表中的数据,提升数据处理的灵活性和方便性。本文将介绍如何创建、查询和写入外表。
对于 Hive 数据表,当前 ByteHouse 支持创建 Hive 外表、创建 Hive 外部数据库、创建 Hive 外部 Catalog 三种方式实现 ByteHouse 与 Hive 的数据映射。
数据映射方式 | 数据映射说明 |
|---|---|
创建 Hive 外部表 | 在表(Table)维度建立 ByteHouse 表到 Hive 表的映射。源表 schema 变更不会直接同步,如果有变更,需删除 ByteHouse 中的外表重新创建一个外表。 |
创建 Hive 外部数据库 | 在数据库(Database)维度建立 ByteHouse Database 到 Hive Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射,可以感知 Hive 表的新增和删除,源表 schema 变更可直接同步至 ByteHouse 中。 |
创建 Hive 外部 Catalog | 在数据目录(Catalog)维度建立 ByteHouse Catalog 到 Hive Catalog 的映射。建立 Catalog 映射之后不需要再手动建立库、表映射,可自动同步 Catalog 下的库、表映射,可以感知 Hive 库、表的新增和删除,源表 schema 变更可直接同步至 ByteHouse 中。创建 Hive 外部 Catalog 的操作详情请参见 Hive Catalog。 |
外表的功能旨在提供除 ByteHouse 内部表以外的其他数据的处理能力。通过一条简单的 DDL 语句,即可在 ByteHouse 上创建一张外表,建立 ByteHouse 表与外部数据源的关联。
ByteHouse 的 Hive 外部表支持两种数据读取场景:一是读取 Hive 本身存储的数据,二是读取存储在火山引擎 AI 数据湖服务(LAS)中的 Hive 数据。以下具体介绍这两种场景下创建 Hive 外表前,您需要获取的权限和信息:
数据读取场景 | 所需权限和连接信息 |
|---|---|
Hive on Hive |
|
Hive on LAS |
|
如需向 Hive on LAS 外表中写入数据,请确认您使用的账号已开通 TOS 的 HNS(分层桶)功能。
通过创建 ByteHouse 外部表,在表维度建立 ByteHouse 表到 Hive 表的映射。ByteHouse 的 Hive 外部表支持两种数据读取场景:一是读取 Hive 本身存储的数据,二是读取存储在火山引擎 AI 数据湖服务(LAS)中的 Hive 数据。以下具体介绍这两种场景下,ByteHouse 对接 Hive 外部表的建表语句:
以下 CREATE 命令执行成功后,您可以在 ByteHouse 的 demo_db 数据库下看到新创建的 hive_table 外表。
CREATE TABLE demo_db.hive_table Engine = CnchHive('thrift://hive_thrift_server_ip:port', 'default', 'test_table') SETTINGS meta_type = 'hive', endpoint = 's3_endpoint', ak_id = 's3_ak', ak_secret = 's3_sk';
参数 | 配置说明 |
|---|---|
建表描述 |
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
以下 CREATE 命令执行成功后,您可以在 ByteHouse 的 demo_db 数据库下看到新创建的 hive_las_table 外表。
CREATE TABLE demo_db.hive_las_table Engine = CnchHive('thrift://lakeformation.las.region.ivolces.com:48869', 'default', 'test_table') SETTINGS meta_type = 'lf', endpoint = 'tos-s3-region.ivolces.com', ak_id = 'your_access_key_id', ak_secret='your_secret_access_key', lf_metastore_url = 'thrift://lakeformation.las.region.ivolces.com:48869', lf_metastore_region = 'region', lf_metastore_ak_id = 'xxx', lf_metastore_ak_secret = 'xxx==', lf_metastore_catalog = 'hive_catalog';
参数 | 配置说明 |
|---|---|
建表描述 |
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
通过创建 ByteHouse 外部数据库,在 Database 维度建立 ByteHouse Database 到 Hive Database 的映射。建立库映射之后不需要再手动建立表映射,可自动同步数据库下的表映射。
ByteHouse 的 Hive 外部表支持两种数据读取场景:一是读取 Hive 本身存储的数据,二是读取存储在火山引擎 AI 数据湖服务(LAS)中的 Hive 数据。以下具体介绍这两种场景下,ByteHouse 对接 Hive 外部表的建表语句:
以下 CREATE 命令执行成功后,ByteHouse 将新建名为 hive_db 的数据库,并可以在该数据库下查看相应的 Hive 外表。
DROP DATABASE IF EXISTS hive_db; CREATE DATABASE hive_db Engine = Hive('thrift://hive_thrift_server_ip:port', 'default') SETTINGS meta_type = 'hive', endpoint = 's3_endpoint', ak_id = 's3_ak', ak_secret = 's3_sk';
参数 | 配置说明 |
|---|---|
DROP 语句 | (可选)以下命令用于确保在创建新数据库前,同名的旧数据库已被移除,以避免创建冲突。在生产环境中请谨慎使用此命令。 |
建库描述 |
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
以下 CREATE 命令执行成功后,ByteHouse 将新建名为 hive_db_las 的数据库,并可以在该数据库下查看相应的 Hive 外表。
DROP DATABASE IF EXISTS hive_db_las; CREATE DATABASE hive_db_las Engine = Hive('thrift://lakeformation.las.region.ivolces.com:48869', 'default') SETTINGS meta_type = 'lf', endpoint = 'tos-s3-region.ivolces.com', ak_id = 'xxx', ak_secret= 'xxx==', lf_metastore_url = 'thrift://lakeformation.las.region.ivolces.com:48869', lf_metastore_region = 'region', lf_metastore_ak_id = 'your_access_key_id', lf_metastore_ak_secret = 'your_secret_access_key', lf_metastore_catalog = 'hive_catalog';
参数 | 配置说明 |
|---|---|
DROP 语句 | (可选)以下命令用于确保在创建新数据库前,同名的旧数据库已被移除,以避免创建冲突。在生产环境中请谨慎使用此命令。 |
建库描述 |
|
引擎参数(Engine) |
|
设置参数(SETTINGS) |
|
Hive 外表的查询和普通表的查询操作一致。指定数据库时,此处的数据库可以是仅创建 Hive 外部表所在的 ByteHouse 数据库,也可以是 Hive 外部数据库。例如:
SELECT * FROM demo_db.hive_las_table WHERE xxx;
查询外表数据时,ByteHouse 支持开启 BSP 模式,操作详情请参见开启 BSP 模式。
说明
如果您希望某次查询时关闭本地盘缓存加载,可在创建外表时设置 SETTINGS 参数,disk_cache_mode = 'SKIP_DISK_CACHE' 。
Hive 外表的写入和普通表的写入操作基本一致,支持通过 INSERT INTO 或 INSERT OVERWRITE 方式写入外部表。
注意
写入 Hive on LAS 外表前请确认您使用的账号拥有以下权限和功能:
目前 ByteHouse 云数仓版不支持未开通 HNS 的 TOS Bucket 写入,更多关于 TOS Bucket 的 HNS 的介绍请参见 TOS 帮助文档。
您可以使用基础的 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:指定需查询的数据库和表名称。此处的数据库可以是仅创建 Hive 外部表所在的 ByteHouse 数据库,也可以是 Hive 外部数据库。 |
写入参数描述 |
|
该语句的功能是重写表。
# 方式 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:指定需查询的数据库和表名称。此处的数据库可以是仅创建 Hive 外部表所在的 ByteHouse 数据库,也可以是 Hive 外部数据库。 |
写入参数描述 |
|
向外表写入数据时,ByteHouse 也支持开启 BSP 模式,操作详情请参见开启 BSP 模式。
BSP 模式可以进行任务级别的容错和更细粒度的调度:
您可以在查询时指定 settings 参数启用 BSP 模式,settings 参数说明如下:
参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
bsp_mode | Bool | 0(关闭) | 设置为 1 表示启用 BSP 模式。启用 BSP 模式后,查询会分阶段执行。阶段之间会使用 shuffle 连接。在失败时会进行任务级别的重试。 |
distributed_max_parallel_size | UInt64 | 等于 worker 数量 | 当单个查询占用内存较大时,通过调大此参数可以增加算子的并行度,减少单个并行度处理数据的数量,减少单位时间内存使用量。必须在启用 bsp_mode 时, |
bsp_max_retry_num | UInt64 | 不同版本默认值不同 | 任务最大的重试次数。ByteHouse 从 2.0.4 版本开始支持设置 |
示例:
SELECT * FROM demo_db.hive_las_table SETTINGS bsp_mode = 1, distributed_max_parallel_size = 4;
Hive 列类型 | CnchHive 列类型 | 描述 |
|---|---|---|
INT/INTEGER | Nullable INT/INTEGER | 无 |
BIGINT | Nullable BIGINT | 无 |
TIMESTAMP | Nullable DateTime | 无 |
STRING | Nullable String | 无 |
VARCHAR | Nullable FixedString | 内部转换为 FixedString |
CHAR | Nullable FixedString | 内部转换为 FixedString |
DOUBLE | Nullable DOUBLE | 无 |
FLOAT | Nullable FLOAT | 无 |
DECIMAL | Nullable DECIMAL | 无 |
MAP | Nullable Map | 无 |
ARRAY | Nullable Array | 无 |