【问题标题】:KSQL streams - Get data from Array of StructKSQL 流 - 从结构数组中获取数据
【发布时间】:2021-04-19 17:56:38
【问题描述】:

我的 JSON 看起来像:

{
  "Obj1": {
    "a": "abc",
    "b": "def",
    "c": "ghi"
  },
  "ArrayObj": [
    {
      "key1": "1",
      "Key2": "2",
      "Key3": "3",

    },
    {
      "key1": "4",
      "Key2": "5",
      "Key3": "6",

    },
    {
      "key1": "7",
      "Key2": "8",
      "Key3": "9",

    }
  ]

}

我已经编写了 KSQL 流将其转换为 AVRO 并保存到主题,以便我可以将其推送到 JDBC Sink 连接器

CREATE STREAM Example1(ArrayObj ARRAY<STRUCT<key1 VARCHAR, Key2 VARCHAR>>,Obj1 STRUCT<a VARCHAR>)WITH(kafka_topic='sample_topic', value_format='JSON');
CREATE STREAM Example_Avro WITH(VALUE_FORMAT='avro') AS SELECT e.ArrayObj[0] FROM Example1 e; 

在 Example_Avro 中,我只能获取数组中的第一个对象。

当我在 KSQL 中从 Example_Avro 中点击 select * 时,如何获得如下所示的数据?

  a    b   key1   key2  key3

  abc  def   1       2     3
  abc  def   4       5     6
  abc  def   7       8     9

【问题讨论】:

    标签: apache-kafka ksqldb confluent-platform


    【解决方案1】:

    测试数据(我删除了key3值后面的无效逗号):

    ksql> PRINT test4;
    Format:JSON
    1/9/20 7:45:18 PM UTC , NULL , { "Obj1": { "a": "abc", "b": "def", "c": "ghi" }, "ArrayObj": [ { "key1": "1", "Key2": "2", "Key3": "3" }, { "key1": "4", "Key2": "5", "Key3": "6" }, { "key1": "7", "Key2": "8", "Key3": "9" } ] }
    

    查询:

    SELECT OBJ1->A AS A, 
           OBJ1->B AS B, 
           EXPLODE(ARRAYOBJ)->KEY1 AS KEY1,
           EXPLODE(ARRAYOBJ)->KEY2 AS KEY2, 
           EXPLODE(ARRAYOBJ)->KEY3 AS KEY3 
    FROM   TEST4 
    EMIT CHANGES;
    

    结果:

    +-------+-------+------+-------+-------+
    |A      |B      |KEY1  |KEY2   |KEY3   |
    +-------+-------+------+-------+-------+
    |abc    |def    |1     |2      |3      |
    |abc    |def    |4     |5      |6      |
    |abc    |def    |7     |8      |9      |
    

    在 ksqlDB 0.6 上测试,其中添加了EXPLODE 函数。

    【讨论】:

    • 谢谢@Robin,我会更新 KSQL 并测试 EXPLODE 函数。
    • 是否有可能将 EXPLODE 语句包装到另一个数组中以使结果类似于表中的一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2018-06-08
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多