前言
最近由于未来工作内容的需要,利用闲碎时间对ClickHouse进行了调研和学习。ClickHouse是由封面贝加尔湖所在的“战斗民族”的Yandex公司所开源的可使用SQL进行实时查询分析的OLAP列式存储数据库。未来可能会用其替代目前使用比较重的Hbase数据库,用于用户画像标签存储,个性化推荐等场景。
今天与大家分享的比较偏实战一些,因为这几天在调研这块内容时遇到了不少坑,觉得还是很有必要分享出来。至于ClickHouse的相关理论部分,会在之后再与大家交流探讨。
ClickHouse的JDBC驱动
目前通过JDBC写ClickHouse一共有三种驱动,除了官方的,还有两种第三方驱动。分别如下:
官方的JDBC Driver:8123端口
基于HTTP实现,整体性能不太出色,大量数据写入时有可能出现超时的现象
housepower的ClickHouse-Native-JDBC:9000端口
基于TCP协议实现,支持高性能写入,数据按列组织并有压缩
Clickhouse4j
基于HTTP,但是相比官方进行了大量优化,更加轻量级和快速
所以,在工作中遇到需要将Hive中的数据批量导入到ClickHouse时,可利用Spark JDBC进行操作,而笔者就是基于第2种驱动,也是在这过程中遇到了一些问题。
Spark JDBC导入数据
spark代码端,加入jdbc驱动依赖
<dependency> <groupId>com.github.housepowergroupId> <artifactId>clickhouse-native-jdbcartifactId> <version>2.1-stableversion>dependency>
使用Spark SQL读取Hive中某张表的数据构建DataFrame
val df = spark.sql( s""" |SELECT member_id, | cell_phone , | card, | age, | age_range, | sex, | birthday |FROM persona.flat_table """.stripMargin)
2. 在ClickHouse预定义表结构,创建表
因为Spark Jdbc的方式并不能够像写Hive一样,支持在写入ClickHouse的时候自动创建表结构,所以就必须要提前创建表。但是实际上在很多场景下,表的数据维度即字段经常新增或删减,例如存储用户