Doris的json解决方案,能否干过Clickhouse?

来源:安瑞哥是码农


上一篇测试了 Clickhouse(下称CK) 在面对 schema-free 的 json 数据时,官方给出的解决方案,从总体体验来看,勉强算差强人意。


「差」主要表现在使用时,发现了一些让人感到莫名其妙的 bug,以及一些明明我觉得可以,但就是实现不了的小功能;


「意」则是一番折腾过后,总算能够实现最初的需求。


这里其实还要补充一点遗憾,那就是 CK 不能利用物化视图的方式,把 json string 给写入到 json 类型的表中。


 

带着这些对 CK 的不满跟遗憾,这一次,我们把目光挪向 Doris,看它在面对相同场景时,能不能给我们带来更多的惊喜呢?


(PS:本次测试的 Doris 版本为 2.0.2)



0. 理论准备


翻遍了 Doris 的官网发现,对于这种 schema-free 的 json,它除了提供跟 CK 一样的能解析 json string 的函数跟 json type 外,最新版本还提供了另一种兼容 json 的数据类型——VARIANT。


json 函数:跟 CK 的功能几乎重合,用来解析 json string 用的;




json type:很迷,从这次体验来看,没看出跟 json string 的明显区别;




variant 类型: Doris2.1之后推出的新数据类型,但因为我当前集群的版本为2.0.2,暂时玩球不成。



1. 导 json 数据


由于我的原始数据源是在 CK 表中,所以第一步,就需要把它给导入过来,当下可行的办法有很多,比如利用 Spark、Flink、JDBC API 等等。


但是我认为最简单高效,几乎不用费一兵一卒的方式,就是在 Doris 里创建 CK 的外表。


1.1 用 Doris 支持的 CK catalog 方式


从官网提供的实施方案来看,具体做法,就是先创建 CK 的 catalog,针对我当前的场景,执行下面的创建语句:


CREATE CATALOG jdbc_clickhouse PROPERTIES (
    "type"="jdbc",
    "user"="default",
    "password"="xxxx",
    "jdbc_url" = "jdbc:clickhouse://hostname:port/database_name",
    "driver_url" = "https://search.maven.org/remotecontent?filepath=com/clickhouse/clickhouse-jdbc/0.4.6/clickhouse-jdbc-0.4.6-all.jar",
    "driver_class" = "com.clickhouse.jdbc.ClickHouseDriver"
);


主要是告诉 Doris,CK 的具体连接方式,只不过这里需要注意一点的是 driver_url 选项的写法,官网提供了以下3种方式:



但在我看来,第3种最为简单,所以我这里用的它。


实践证明,这一步创建没有问题。


接着,就是切换到这个新建的 catalog 里面,然后读取到 CK 的数据,但是验证发现,不行。


切换 catalog 没有问题



查表也没有问题



但一查数据就废



虽然简单,但该方案行不通,换!


(怀疑过是 jdbc jar 包导致的问题,但是这个版本的 jar 已经在很多地方实践过了,暂时原因不明)


1.2 用 Spark


很快,我又劈哩叭啦用 spark 写了个读取 CK 表,写 Doris 的代码,将原来这张 CK 表给导入到 Doris 中了。


导入数据量:



当然,这个过程也没有一帆风顺,中间遇到了个比较膈应人的关于写入格式问题,好在及时找到社区的人帮忙解决了,关于这部分内容,暂时不展开,后面有机会在直播的时候给大家讲。



2. 开始操作


下面,咱就着手开始跟之前在 CK 一样的操作,看 Doris 能不能顺利完成我的需求。


同样,也是利用 Doris 对 json string 提供的操作函数,将 json(detail字段的值) 中的 data key 对应的 value 取出来,



存储到下面的 detail_json 字段里(json type)。


执行的写入 SQL 如下:


还记得上一篇,在 CK 执行一样的操作时,这里会报错的,但到了 Doris 这里,就没有问题。


但是,咱不能高兴太早,接下来,再来执行一个已经在 CK 验证过的查询。


查询当前数据中,域名注册地址在冰岛的数量有多少个,看下 CK 跟 Doris 的查询语法差异(忽略查询结果的不同):


CK 的查询语法


Doris 的查询语法


发现没有,虽然大家都是 json type,但是查询的方式却大不一样,我个人会更喜欢 CK 的查询方式一些,你呢?


而且,这里其实还引出另外一个问题,那就是从 Doris 对 json 的处理函数来看,它似乎并没有区分,你存储的格式是 String type 还是 json type


把 json 存成 String type,处理起来用的是那些函数,存储为 json type,处理起来还是用的那些函数,对于这个操作,说实话,我有点不太能理解。


而且,从存储的大小来看,也几乎没有多少差别:


至于这个 json type 相比 json string,在查询时有多少效率差异,因为数据量有限,目前还看不太出来。


而如果这个时候,我要是对 json 里面的 key 进行聚合查询呢?


比如,对于 CK 来说,可以对 json type 的内部字段这么聚合:


 


而对于 Doris 的 json type,我只能这样写:



但是要知道,一样的聚合写法,我完全可以去查询 json string 的数据:



所以你觉得,对于 Doris 的 json type,它真的给我们带来了多少方便呢?



最后


从这次 Doris 提供的对 json 数据的解决方案来看,虽然在操作过程中没有遇到什么明显让人不舒服的 bug。


但是,它提供的 json type 从这次体验来看,个人认为比较鸡肋,跟我直接把数据存为 json string 在功能上,几乎没有什么明显区别。


而对比 CK 的 json type,虽然有 bug,但它明显区分了跟 json string 不同的使用方式,提供的功能也更加实用。


希望下次测评 Doris 的 VARIANT type 能给我带来惊喜。


最后,同样作为 json type,CK 跟 Doris,你更中意哪个呢?


请使用浏览器的分享功能分享到微信等