Apache kafka 如何从嵌套的JSON对象创建KSQLdb流字段
我有一个主题,我将以以下格式发送json:Apache kafka 如何从嵌套的JSON对象创建KSQLdb流字段,apache-kafka,confluent-platform,ksqldb,Apache Kafka,Confluent Platform,Ksqldb,我有一个主题,我将以以下格式发送json: { "schema": { "type": "string", "optional": true }, "payload": “CustomerData{version='1', customerId=‘76813432’, phone=‘76813432’}” } 我想用customerId和phone创建一个流
{
"schema": {
"type": "string",
"optional": true
},
"payload": “CustomerData{version='1', customerId=‘76813432’, phone=‘76813432’}”
}
我想用customerId和phone创建一个流,但我不知道如何用嵌套的json对象定义这个流。(编辑)
会是这样吗?如何在定义streams字段时取消引用嵌套对象
实际上,上述内容不适用于字段定义,它表示:
Caused by: line 2:12:
extraneous input '.' expecting {'EMIT', 'CHANGES',
'INTEGER', 'DATE', 'TIME', 'TIMESTAMP', 'INTERVAL', 'YEAR', 'MONTH', 'DAY',
应用函数extractjsonfield
您可以使用一个名为ksqlDB的函数
首先,您需要提取模式和有效负载字段:
然后可以选择json中的嵌套字段:
SELECT EXTRACTJSONFIELD(payload, '$.version') AS version FROM customer;
但是,您的负载数据似乎没有有效的JSON格式
应用结构模式 如果您的整个负载编码为JSON字符串,这意味着您的数据如下所示:
{
"schema": {
"type": "string",
"optional": true
},
"payload": {
"version"="1",
"customerId"="76813432",
"phone"="76813432"
}
}
您可以按如下方式定义STRUCT:
CREATE STREAM customer (
schema STRUCT<
type VARCHAR,
optional BOOLEAN>,
payload STRUCT<
version VARCHAR,
customerId VARCHAR,
phone VARCHAR>
)
WITH (
KAFKA_TOPIC='customers',
VALUE_FORMAT='JSON'
);
好的,您能否澄清EXTRACTJSONFIELD(消息“$.payload.version”)是如何提取的将在流定义中应用我想看看如何使用struct和EXTRACTJSONFIELD方法来实现这一点。而且,如果负载再次具有子对象,struct是否可以再次应用?因此,为了澄清,我需要知道例如,在CREATE stream命令期间,消息是否是内置对象?在这种情况下,流字段的名称将如何设置?另外,请验证STRING和VARCHAR是否与您在回答中的定义相同?
{
"schema": {
"type": "string",
"optional": true
},
"payload": {
"version"="1",
"customerId"="76813432",
"phone"="76813432"
}
}
CREATE STREAM customer (
schema STRUCT<
type VARCHAR,
optional BOOLEAN>,
payload STRUCT<
version VARCHAR,
customerId VARCHAR,
phone VARCHAR>
)
WITH (
KAFKA_TOPIC='customers',
VALUE_FORMAT='JSON'
);
CREATE STREAM customer_analysis AS
SELECT
payload->version as VERSION,
payload->customerId as CUSTOMER_ID,
payload->phone as PHONE
FROM customer
EMIT CHANGES;