簡體   English   中英

如何從嵌套的 JSON 對象創建 KSQLdb 流字段

[英]How Create KSQLdb Stream fields from nested JSON Object

我有一個主題,我正在以以下格式發送 json:

 {
  "schema": {
   "type": "string",
   "optional": true
  },
  "payload": “CustomerData{version='1', customerId=‘76813432’,      phone=‘76813432’}”
} 

我想用 customerId 和電話創建一個流,但我不確定如何根據嵌套的 json 對象定義流。 (已編輯)

CREATE  STREAM customer (
    payload.version VARCHAR,
    payload.customerId VARCHAR,
    payload.phone VARCHAR
  ) WITH (
    KAFKA_TOPIC='customers',
    VALUE_FORMAT='JSON'
  );    

它會是那樣的嗎? 如何在定義流字段時取消引用嵌套對象?

實際上,上面的內容不適用於它所說的字段定義:

Caused by: line 2:12: 
extraneous input '.' expecting {'EMIT', 'CHANGES',
'INTEGER', 'DATE', 'TIME', 'TIMESTAMP', 'INTERVAL', 'YEAR', 'MONTH', 'DAY',

應用函數extractjsonfield

您可以使用一個名為extractjsonfield的ksqlDB 函數。

首先,您需要提取架構負載字段:

CREATE STREAM customer (
  schema VARCHAR,
  payload VARCHAR
) WITH (
    KAFKA_TOPIC='customers',
    VALUE_FORMAT='JSON'
); 

然后您可以選擇 json 中的嵌套字段:

SELECT EXTRACTJSONFIELD(payload, '$.version') AS version FROM customer;

但是,您的負載數據似乎沒有有效的 JSON 格式


應用 STRUCT 模式

如果您的整個有效負載被編碼為 JSON 字符串,這意味着您的數據如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM