如何从HDFS导入数据到ClickHouse

从ClickHouse 18.16.0版本开始支持从HDFS读文件,在 19.1.6 版本对HDFS访问功能进行了增强,支持读和写,在 19.4 版本以后开始支持Parquet格式。本文介绍了如何从HDFS中读数据到ClickHouse中,测试版本为:19.4
在访问HDFS之前需要定义一个访问HDFS的表,指定表引擎为HDFS。表创建完成后,就可以对这张表进行查询。

一、查询CSV文件

例如,在HDFS上有一个数据文件:books.csv,内容如下:

hadoop fs -cat /user/hive/ck/book_csv/books.csv

0553573403,book,A Game of Thrones,7.99
0553579908,book,A Clash of Kings,7.99
055357342X,book,A Storm of Swords,7.99
0553293354,book,Foundation,7.99
0812521390,book,The Black Company,6.99
0812550706,book,Ender's Game,6.99
0441385532,book,Jhereg,7.95
0380014300,book,Nine Princes In Amber,6.99
0805080481,book,The Book of Three,5.99
080508049X,book,The Black Cauldron,5.99

在ClickHouse上创建一个访问books.csv文件的表:

CREATE TABLE hdfs_books_csv
(
    isbn String,
    cat String,
    name String,
    price Float64
)
ENGINE = HDFS('hdfs://host123:9000/user/hive/ck/book_csv/books.csv', 'CSV')

查询hdfs_books_csv表:

SELECT * FROM hdfs_books_csv
┌─isbn───────┬─cat──┬─name──────────────────┬─price─┐
│ 0553573403 │ book │ A Game of Thrones │ 7.99 │
│ 0553579908 │ book │ A Clash of Kings │ 7.99 │
│ 055357342X │ book │ A Storm of Swords │ 7.99 │
│ 0553293354 │ book │ Foundation │ 7.99 │
│ 0812521390 │ book │ The Black Company │ 6.99 │
│ 0812550706 │ book │ Ender's Game │ 6.99 │
│ 0441385532 │ book │ Jhereg │ 7.95 │
│ 0380014300 │ book │ Nine Princes In Amber │ 6.99 │
│ 0805080481 │ book │ The Book of Three │ 5.99 │
│ 080508049X │ book │ The Black Cauldron │ 5.99 │
└────────────┴──────┴───────────────────────┴───────┘

查询出的数据与books.csv的内容相同。

当用户执行 SELECT * FROM hdfs_books_csv 语句时,数据流向如下图:
在这里插入图片描述
这种使用场景相当于把HDFS做为ClickHouse的外部存储,当查询数据时,直接访问HDFS的文件,而不需要把HDFS文件导入到ClickHouse再进行查询。由于是从HDFS拉取数据,相对于ClickHouse的本地存储查询,速度较慢。

二、查询Parquet文件

ClickHouse 19.4 以后开始支持Parquet格式,下面对Parquet格式的HDFS数据文件进行测试,先上传一个Parquet数据文件 books.parquet 到HDFS,文件内容与books.csv相同,在HDFS上的路径如下:
/user/hive/ck/book_parquet/books.parquet

创建一个访问books.parquet文件的表:

CREATE TABLE hdfs_books_parquet
(
    isbn String,
    cat String,
    name String,
    price Float64
)
ENGINE = HDFS('hdfs://host123:9000/user/hive/ck/book_parquet/books.parquet', 'Parquet')

在ClickHouse查询 hdfs_books_parquet 表:

SELECT * FROM hdfs_books_parquet

查询出的数据与books.csv的内容相同。

以上的操作是从HDFS上直接查询数据,也可以将读取的数据加载到ClickHouse的本地表。

三、从HDFS导入数据

在ClickHouse先创建一个目标表,然后执行INSERT…SELECT从HDFS导入数据。

--创建目标表
CREATE TABLE books_local
(
    isbn String,
    cat String,
    name String,
    price Float64
)
ENGINE = Log;
--从HDFS导入数据
INSERT INTO books_local SELECT * FROM hdfs_books_parquet;
--查询目标表
SELECT * FROM books_local;

从HDFS导入数据到ClickHouse,然后查询ClickHouse本地表的数据流向图如下:
在这里插入图片描述
ClickHouse支持的文件格式参见:https://clickhouse.yandex/docs/en/interfaces/formats/
四、总结
用户通过执行SQL语句,可以在ClickHouse中直接读取HDFS的文件,也可以将读取的数据导入到ClickHouse本地表。ClickHouse提供了对Hadoop生态圈更加友好的访问方式。

五、参考资料
https://github.com/yandex/ClickHouse/pull/3617/

https://github.com/yandex/ClickHouse/pull/4084/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值