ksql-从json数组创建流

时间:2018-06-25 23:58:27

标签: apache-kafka collectd ksql

我的kafka主题以这种格式(来自收集的)来推送数据:

[{"values":[100.000080140372],"dstypes":["derive"],"dsnames":["value"],"time":1529970061.145,"interval":10.000,"host":"k5.orch","plugin":"cpu","plugin_instance":"23","type":"cpu","type_instance":"idle","meta":{"network:received":true}}]

它是数组,整数和浮点数的组合...整个东西都在json数组中。结果,Im忙于使用 ksql 处理此数据。

当我创建“默认”流为

create stream cd_temp with (kafka_topic='ctd_test', value_format='json');

我得到这个结果:

ksql> describe cd_temp;

 Field   | Type                      
-------------------------------------
 ROWTIME | BIGINT           (system) 
 ROWKEY  | VARCHAR(STRING)  (system) 
-------------------------------------

任何 select 将返回ROWTIME和ROWKEY的8位十六进制值。

我花了一些时间尝试提取json字段,但无济于事。我担心的是:

ksql> print 'ctd_test' from beginning;
Format:JSON
com.fasterxml.jackson.databind.node.ArrayNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

此主题是否可能不能在 ksql 中使用?是否有一种将外部数组拆包以获取内部有趣位的技术?

1 个答案:

答案 0 :(得分:3)

在撰写本文时(2018年6月),KSQL无法处理将整个内容嵌入顶级数组的JSON消息。有一个github issue to track this。我建议对此问题进行+1投票,以提高优先级。

此外,我注意到您的create stream语句未定义json消息的架构。虽然在这种情况下这无济于事,但您需要使用其他Json输入格式,即您创建的语句应类似于:

create stream cd_temp (values ARRAY<DOUBLE>, dstypes ARRAY<VARCHAR>, etc) with (kafka_topic='ctd_test', value_format='json');