Как стандартизировать вывод USQL, чтобы иметь данные для всех столбцов при преобразовании из JSON - PullRequest
0 голосов
/ 26 ноября 2018

Как стандартизировать вывод USQL, чтобы иметь данные для всех столбцов при преобразовании из JSON

У нас есть требование стандартизировать вывод USQL.USQL читает данные в формате JSON (исходный файл) и преобразует их в формат csv.Проблема в том, что количество столбцов, которые мы имеем для каждой строки в CSV, не одинаково из-за отсутствия данных в JSON.Иногда в результирующем наборе USQL есть строка в csv со столбцами «N», другая строка со столбцами «N + 1» (ячейками).Мы хотели бы стандартизировать вывод, имея одинаковые номера столбцов в CSV для всех строк.Как нам этого добиться?Мы не имеем никакого контроля над данными исходного файла, нам нужно было бы выполнить стандартизацию во время обработки.Кто-нибудь сталкивался с подобными проблемами и нашел решение?Спасибо за вашу помощь!

Вводные данные:

{"map": {"key1": 100,    "key2": 101,    "key3": 102},  "id": 2,  "time": 1540300241230}
{"map": {"key1": 200,    "key2": 201,    "key3": 202    "key4": 203},  "id": 2,  "time": 1540320246930}
{"map": {"key1": 300,    "key3": 301,    "key4": 303},  "id": 2,  "time": 1540350246930}

Как только приведенный выше JSON конвертируется в CSV на основе некоторых вычислений

Вывод как есть, который является неправильным

ключ1, ключ2, ключ3, ключ4

100, 101, 102
200, 201, 202, 203
300, 301, 303

Значение «301» не связано с ключом2

Ожидаемый вывод - # по умолчанию для пропущенных значений столбцов

key1, key2, key3, key4

100, 101, 102,  #
200, 201, 202, 203
300, #, 301, 303

Позже все заголовки (key1,key2 ..) будет заменено фактическими именами заголовков (Давление, Скорость ... и т. д.)

1 Ответ

0 голосов
/ 08 декабря 2018

ИСПОЛЬЗОВАТЬ БАЗУ ДАННЫХ [ADLSDB];

ОБЪЯВИТЬ ВНЕШНЕЕ @INPUT_FILE string = "/adlspath/keyValue.txt";DECLARE EXTERNAL @PIVOT_FILE string = "/adlspath/pivot.txt";

/ * Запускаются метаданные о запросе - содержимое файла request.json * /

@ requestData = EXTRACTid int, строка метки времени, строка ключа, значение int FROM @INPUT_FILE USING Extractors.Csv ();@data = SELECT id AS ID, отметка времени AS отметка времени, ключ AS ключ, значение AS значение FROM @requestData;

DECLARE EXTERNAL @ids string = "key1, key2, key3, key4";// "внешняя декларация"

@ result = SELECT * FROM (идентификатор SELECT, метка времени, ключ, значение FROM @data) AS D PIVOT (SUM (значение) FOR ключ IN (заголовок @ids AS)) ASP;

OUTPUT @result TO @PIVOT_FILE USING Outputters.Csv (цитирование: false, outputHeader: false);

Мне удалось приблизиться к решению с помощью приведенного выше кода, однакоЯ застрял при передаче нескольких значений в предложении IN.Список @ids я получу во время компиляции USQL, но передача его в виде скалярной переменной, разделенной запятыми, не даст результата.Если я передаю только одно значение (предположим, key1), тогда условие IN совпадает и выводит строки для Key1.Любой знает, как передать несколько значений в предложение IN в функции USQL PIVOT.

------ Обновлено ------------

Мы смоглирешить проблему с помощью динамического USQL.Один USQL записывает операторы USQL в выходной файл в требуемом формате.Затем другое действие фабрики данных будет читать динамически сгенерированный USQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...