clickhouse csv导入_如何从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.csv0553573403,book,A Game of Thrones,7.990553579908,book,A Clash of Kings,7.99055357342X,book,A Storm of Swords,7.990553293354,book,Foundation,7.990812521390,book,The Black Company,6.990812550706,book,Ender's Game,6.990441385532,book,Jhereg,7.950380014300,book,Nine Princes In Amber,6.990805080481,book,The Book of Three,5.99080508049X,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 语句时,数据流向如下图:

d69e563a8c40318d51ea1aab7be1cb39.png

在ClickHouse直接查询HDFS的数据

这种使用场景相当于把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┌─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 │└────────────┴──────┴───────────────────────┴───────┘

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

从HDFS导入数据

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

CREATE TABLE books_local(isbn String,cat String,name String,price Float64)ENGINE = Log;INSERT INTO books_local SELECT * FROM hdfs_books_parquet;SELECT * FROM books_local;
c75b15b91c4e16fdf82376a3586f1d8d.png

先导入到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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值