Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 带有JSON格式消息的KSQL EXTRACTJSONFIELD返回null_Apache Kafka_Ksqldb - Fatal编程技术网

Apache kafka 带有JSON格式消息的KSQL EXTRACTJSONFIELD返回null

Apache kafka 带有JSON格式消息的KSQL EXTRACTJSONFIELD返回null,apache-kafka,ksqldb,Apache Kafka,Ksqldb,使用KSQL-CLI,带有kafka主题,其消息为JSON对象。我希望在不声明详尽的结构或映射字段定义的情况下提取obj.updaterId等字段 我可以通过多种方式成功创建流,最简单的方法是: CREATE STREAM objs1 (obj VARCHAR) WITH (kafka_topic='json-topic', value_format='JSON'); 简单的选择工作如预期,您可以看到的内容obj SELECT * FROM objs1; 1537804190394 |“5

使用KSQL-CLI,带有kafka主题,其消息为JSON对象。我希望在不声明详尽的结构或映射字段定义的情况下提取obj.updaterId等字段

我可以通过多种方式成功创建流,最简单的方法是:

CREATE STREAM objs1 (obj VARCHAR) WITH (kafka_topic='json-topic', value_format='JSON');
简单的选择工作如预期,您可以看到的内容obj

SELECT *  FROM objs1;
1537804190394 |“5ba8f7e6b93c7964efb00f48”|{name=com.test.auto.sensor, 更新ID=systems@test.com,desc=foobar}

这里不起作用的是使用EXTRACTJSONFIELD从obj提取JSON字段的任何尝试。对顶级对象和嵌套对象的响应均为“null”

SELECT EXTRACTJSONFIELD(obj, '$.updaterId') AS updater FROM objs1;
空的

其中有一条说明,如果数据是字符串列中的实际对象,我可以使用STRUCT。它并没有说我必须使用STRUCT

顺便说一句,使用STRUCT确实有效,但我对EXTRACTJSONFIELD感兴趣,因为我的消息的深层结构会有所不同。换句话说,如果消息不包含深层结构,则有时会出现空响应

作品:

CREATE STREAM objs1 (obj STRUCT<updaterId VARCHAR>) WITH (kafka_topic='json-topic', value_format='JSON');
SELECT OBJ->updaterId AS updater FROM OBJS1;
使用(kafka_topic='json-topic',value_format='json')创建流objs1(obj STRUCT);
从OBJS1中选择OBJ->updaterId作为更新程序;
我发誓,我在其他人的问题中看到了其他类似安排的例子。我错过了什么

注意:我已经为这篇文章简化了JSON。它更大,更嵌套的IRL,但我相信这个简单的例子是准确的


OSX上的KSQL 5.0.0版。

最新版本中的JSON解析器中似乎有一个实质性的变化,即从VARCHAR列中的JSON内容中删除引号(从我的示例中可以看到),这导致JSON解析器无法找到该字段名

这个问题建议使用STRUCT而不是EXTRACTJSONFIELD(与上面的工作示例一样)


这似乎不适合我的用例,因为我的深域名称可能会更改。将对此进行更多研究并进行更新。

最新版本中的JSON解析器似乎有重大更改,从VARCHAR列中的JSON内容中删除引号(从我的示例中可以看到),这导致JSON解析器无法找到该字段名

这个问题建议使用STRUCT而不是EXTRACTJSONFIELD(与上面的工作示例一样)


这似乎不适合我的用例,因为我的深域名称可能会更改。将对此进行更多研究并更新。

已经解决,您应该能够像以前一样使用
EXTRACTJSONFIELD
函数。请注意,您现在需要使用主机的最新版本才能拥有此功能。

已解决,您应该能够像以前一样使用
EXTRACTJSONFIELD
函数。请注意,您现在需要使用master的最新版本才能拥有此功能。

您好,Tim,您说得对,我认为您遇到了这个问题。让我们在github问题中追踪它。嗨,Tim,你是对的,我认为你正在关注这个问题。让我们在github问题中跟踪它。
CREATE STREAM objs1 (obj STRUCT<updaterId VARCHAR>) WITH (kafka_topic='json-topic', value_format='JSON');
SELECT OBJ->updaterId AS updater FROM OBJS1;