K SQL потоков - итерация по JSON - PullRequest
1 голос
/ 10 января 2020

Как перебирать JSON в K SQL потоках:

Мой JSON выглядит так:

{
   "Obj" {
       "ID" : "1"
    },
    "KeyValues": {
        "Key1": "value1",
        "Key2": "value2",
        "Key3": "value3",
        "Key4": "value4",
        "Key5": "value5",
        "Key6": "value6",
        "Key7": "value7",
        "Key8": "value8",
        "Key9": "value9",
        "Key10": "value10",
            |
            |
            |
            |

        "KeyN": "valueN"
  }
}

Как мне получить o / p в K SQL. Необходимо перебрать JSON объект для N элементов и перечислить, как показано ниже.

   ID    KEY              VALUE
----------------------------------    
   1     Key1            value1
   1     Key2            value2
   1     Key3            value3
   1     Key4            value4
   1     Key5            value5
   1     Key6            value6
   1     Key7            value7
   1     Key8            value8
   1     Key9            value9
   1     Key10           value10
   1            |
   1            |
   1            |
   1            |
   1 
   1      KeyN          valueN

Заранее спасибо.

1 Ответ

1 голос
/ 11 января 2020

Похоже, UDTF - правильное решение для вас. Вы можете увидеть взорвать в качестве примера UDTF, который принимает массив, а затем выводит N строк, по одной для каждого элемента.

Подпись для вашей UDTF будет аналогичной:

@Udtf(schema = "STRUCT<key VARCHAR, value VARCHAR>")
public <T> List<Struct> expandMapEntries(final Map<String, String> input) {
  // output a list of key value pairs as a struct from 'input'
}

Затем вы можете использовать этот UDTF и выбрать из него поля (что-то вроде ниже):

CREATE STREAM expanded AS SELECT EXPAND_MAP_ENTRIES(KeyValues) AS keyVals FROM source;
CREATE STREAM flattened AS keyVals->key as `KEY`, keyVals->value AS VALUE FROM expanded;

Дайте мне знать, если это работает для вас, и не стесняйтесь обращаться к слабость сообщества (@almog) - мне очень интересен этот вариант использования.

...