博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何从HDFS导入数据到ClickHouse
阅读量:3937 次
发布时间:2019-05-23

本文共 2777 字,大约阅读时间需要 9 分钟。

从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.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 语句时,数据流向如下图:

在这里插入图片描述
这种使用场景相当于把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/

转载地址:http://hzuwi.baihongyu.com/

你可能感兴趣的文章
how to move pivot to origin
查看>>
Optimizate objective function in matrix
查看>>
Convert polygon faces to triangles or quadrangles
查看>>
How do I divide matrix elements by column sums in MATLAB?
查看>>
read obj in matlab
查看>>
find out the neighbour matrix of a mesh
查看>>
Operators and special characters in matlab
查看>>
As-Conformal-As-Possible Surface Registration
查看>>
qmake Variable Reference
查看>>
Lesson 2 Gradient Desent
查看>>
find border vertex
查看>>
matlab sliced variable
查看>>
create symbolic array
查看>>
TAUCS库的编译(vs2010)
查看>>
color vector using in plotting example points and lines between corresponding vertices
查看>>
mex 里面调用matlab函数
查看>>
matlab中cuda编程中分配grid和block dimension的时候的注意事项
查看>>
GPU CUDA and MEX Programming
查看>>
arrayfun用法
查看>>
矩阵积分
查看>>