ByteHouse 研发的 CnchHDFS 引擎深度集成 Apache Hadoop 生态系统,支持通过 ByteHouse 直接管理 HDFS 上的数据。本文将介绍如何在 ByteHouse 云数仓版中使用 HDFS 外表。
ByteHouse 借助 CnchHDFS 引擎实现与 HDFS 的对接,无需将数据迁移至 ByteHouse 内部,即可对 HDFS 上的原始数据执行查询、写入等操作。ByteHouse 提供了两种使用方式:CnchHDFS 表引擎(持久化外表)和 CnchHDFS 表函数,您可根据业务场景灵活选择。
CnchHDFS 表引擎和 CnchHDFS 表函数两种方式对比如下:
方式 | 适用场景 |
|---|---|
CnchHDFS 表引擎 |
|
CnchHDFS 表函数 |
|
外部表的功能旨在提供除 ByteHouse 内部表以外的其他数据的处理能力。通过一条简单的 DDL 语句,即可在 ByteHouse 上创建一张外部表,建立 ByteHouse 表与外部数据源的关联。
在执行 HDFS 外表的查询、写入或管理操作前,请确保您已获得该表对应的读写权限。
语法
CREATE TABLE [db_name.]table_name ( column1 type1, column2 type2, ... ) ENGINE=CnchHDFS('hdfs_path', 'format', '[compression]') [SETTINGS key=value];
参数 | 是否必填 | 配置说明 |
|---|---|---|
| 是 |
|
| 是 | 表引擎指定为 CnchHDFS。 |
| 是 | 指定 HDFS 外表对应的文件存储路径,需具体到某份文件或使用通配符选择多份文件。
|
| 是 | 指定 HDFS 外表的文件格式,请根据您的文件格式填写。当前 CnchHDFS 支持的文件格式请参见相关参考:CnchHDFS 表支持的文件格式。 |
| 否 | 可选配置。当前支持 gzip/zlib/brotli/xz/zstd/lz4/bzip2/snappy 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 否 | 配置 settings 参数,常用 settings 参数如下:
|
示例
创建单文件表
CREATE TABLE hdfs_engine_table ( name String, value UInt32 ) ENGINE=CnchHDFS('hdfs://ip:port/prefix/file.csv', 'CSV', 'none') SETTINGS index_granularity=8192
使用通配符创建多文件表
CREATE TABLE hdfs_engine_table_glob_uri ( name String, value UInt32 ) ENGINE=CnchHDFS('hdfs://ip:port/prefix/test/file*.csv', 'CSV', 'none') SETTINGS index_granularity=8192
您可通过 INSERT INTO 语句向 HDFS 外表写入数据,用法与普通表的写入操作一致。
示例如下:
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3);
您可通过 SELECT 语句查询 HDFS 外表中的数据,用法与普通表的查询操作一致。ByteHouse 也支持通过 _path和_file 列进行剪枝查询。示例如下:
查询数据
SELECT * FROM hdfs_engine_table;
使用 _file 列进行剪枝查询
SELECT * FROM hdfs_engine_table_glob_uri WHERE _file = 'fileSimple.csv';
默认情况下,外表的 resources_assign_type **** 值为 server_push,在该模式下,数据文件会被发往 Worker 进行查询。如果您想在 Server 本地查询,可以修改 resources_assign_type 为 server_local。
ALTER TABLE hdfs_engine_table MODIFY SETTING resources_assign_type='server_local'
ByteHouse 也支持了 CnchHDFS 表函数,无需预创建 HDFS 外表,可直接向 HDFS 表写入数据,快速查询 HDFS 表数据。
直接向 HDFS 表写入数据,该操作默认覆盖原文件。
语法
INSERT INTO FUNCTION CnchHDFS( 'hdfs_path', 'column1 type1, column2 type2, ...', '[format]', '[compression]' ) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), (...);
参数 | 是否必填 | 配置说明 |
|---|---|---|
| 是 | 表函数指定为 CnchHDFS。 |
| 是 | 指定 HDFS 外表对应的文件存储路径,需具体到某份文件。填写示例: |
| 是 | 定义表结构,表结构需与 HDFS 源表保持一致,包含列名和列类型。填写示例: |
| 否 | 可选配置。指定 HDFS 外表的文件格式,请根据您的文件格式填写。当前 CnchHDFS 支持的文件格式请参见相关参考:CnchHDFS 表支持的文件格式。 |
| 否 | 可选配置。当前支持 gzip/zstd/lz4/snappy/bzip2/xz/brotli 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 是 | 指定需写入的数据。 |
示例
INSERT INTO FUNCTION CnchHDFS( 'hdfs://ip:port/prefix/test/file.csv', 'city String, name String', 'CSV', 'none' ) VALUES ('one', '1'), ('two', '2'), ('three', '3');
分区级写入数据的语法与普通写入数据一致,但需在 hdfs_path 路径中包含 '{_partition_id}' 字段,其他参数请参考上文参数说明。
示例如下:
INSERT INTO FUNCTION CnchHDFS( 'hdfs://ip:port/prefix/test/{_partition_id}_file.csv', 'city String, name String', 'CSV', 'none' ) PARTITION BY city VALUES ('one', '1'), ('two', '2'), ('three', '3');
使用 CnchHDFS 函数直接查询 HDFS 表。
语法
SELECT * FROM CnchHDFS( 'hdfs_path', 'column1 type1, column2 type2, ...', '[format]', '[compression]' ) [WHERE where_clause];
参数 | 是否必填 | 配置说明 |
|---|---|---|
| 是 | 表函数指定为 CnchHDFS。 |
| 是 | 指定 HDFS 外表对应的文件存储路径,需具体到某份文件。填写示例: |
| 是 | 指定 HDFS 外表的表结构,需与源表保持一致,包括列名和列类型。填写示例: |
| 否 | 可选配置。指定 HDFS 外表的文件格式,请根据您的文件格式填写。当前 CnchHDFS 支持的文件格式请参见相关参考:CnchHDFS 表支持的文件格式。 |
| 否 | 可选配置。当前支持 gzip/zstd/lz4/snappy/bzip2/xz/brotli 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 否 | 指定筛选条件。ByteHouse HDFS 外表支持通过 |
示例
查询单份文件
SELECT * FROM CnchHDFS( 'hdfs://ip:port/prefix/test/file.csv', 'city String, name String', 'CSV', 'none' );
使用通配符查询多份文件,并进行剪枝查询
SELECT * FROM CnchHDFS( 'hdfs://ip:port/prefix/test/file*.csv', 'city String, name String', 'CSV', 'none' ) WHERE _path LIKE '%test%';
文件格式 | Read | Write |
|---|---|---|
✅ | ✅ | |
✅ | ❌ | |
✅ | ✅ | |
✅ | ❌ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ❌ | |
❌ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
✅ | ❌ |