Apache kafka 如何从嵌套的JSON对象创建KSQLdb流字段

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创建一个流

我有一个主题,我将以以下格式发送json:

 {
  "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;