从ClickHouse 18.16.0版本开始支持从HDFS读文件,在 19.1.6 版本对HDFS访问功能进行了增强,支持读和写,在 19.4 版本以后开始支持Parquet格式。本文介绍了如何从HDFS中读数据到ClickHouse中,测试版本为:19.4 。
一、查询CSV文件
例如,在HDFS上有一个数据文件:books.csv,内容如下:
hadoop fs -cat /user/hive/ck/book_csv/books.csv

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

查询hdfs_books_csv表:

查询出的数据与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文件的表:

在ClickHouse查询 hdfs_books_parquet 表:

查询出的数据与books.csv的内容相同。
以上的操作是从HDFS上直接查询数据,也可以将读取的数据加载到ClickHouse的本地表。
三、从HDFS导入数据
在ClickHouse先创建一个目标表,然后执行INSERT...SELECT从HDFS导入数据。

从HDFS导入数据到ClickHouse,然后查询ClickHouse本地表的数据流向图如下:


四、总结
用户通过执行SQL语句,可以在ClickHouse中直接读取HDFS的文件,也可以将读取的数据导入到ClickHouse本地表。ClickHouse提供了对Hadoop生态圈更加友好的访问方式。

