需求:
1、在工作中,我们常常需要将外部 hive 或者 mysql、oracle 等数据源导入到clickhouse中,对于多种外部数据源,是否有通用的数据导入方案?
2、我们在clickhouse上维持一张查询主表,但外部数据源表是hive增量表,新增数据需要同步更新到clickhouse上,是否有不通过第三方组件的插入方式?
解决:
1、外部数据源有可能是多种,如下图:
那么这里不纠结某个外部数据源的导入速度,我这里提供一种通用方式,可以先在clickhouse中
创建一张外部引擎表,详细官网都有格式介绍:https://clickhouse.com/docs/zh/engines/table-engines/integrations/hdfs/
由于clickhouse支持insert into xxx select * from xxx 语句进行写入
故我们可以将外部引擎表通过此函数导入进需要经常查询的MergeTree引擎表中
那么有人可能会说:既然外部引擎表可以供我们查询,我们为何要重新写入到MergeTree引擎表?
这是因为clickhouse在OLAP查询分析中的核心引擎就是MergeTree,而外部表只是嫁接表,无法使用clickhouse的核心能力,故需要有一层导入过程,这里可以将外部引擎表想象成中间层,最终供外部查询的数据都应该在MergeTree表中,如下图:
2、在hive增量表层面上,新增数据大部分会存储到一张增量表然后合并到hive主表,针对这种新增数据很明确的情况,我们常常使用的方式是通过clickhouse创建一张临时外部表指向hive临时表,然后通过 insert into xxx select * from xxx 语句写入进主表即可。