Проверка условия в наборе строк U-SQL

У меня есть простой вариант использования. Я хочу фильтровать данные в зависимости от того, содержит ли файл json некоторые поля с именами вроде «событие».

У меня есть данные, которые могут иметь 1, 2, 3 или любое количество массивов json.

В массивах есть объекты json.

Итак, считайте, что у меня есть 4 массива: [A], [B], [C], [D]

Я могу извлечь их в U-SQL с помощью JSON Extractor. Затем получите значения массива как JSONTuple.

Как только они будут извлечены. Я хочу проверить, есть ли в массиве определенное поле json.

Нравится: select @data where JsonContains(A, "ordernumber") .

Как я могу сделать это в USQL? Простой способ сделать:

Select [A], [B], [c], [D] where A constains "event" ...

Я пытался сделать, но нет возможности сделать, как в sql. Пожалуйста помоги. Спасибо.

В качестве примечания: мне кажется, что единственный способ справиться с этим несоответствующим количеством столбцов (из-за которых я должен фильтровать наборы строк) в usql:

  1. Отфильтруйте данные по заданным столбцам. Как тот, о котором я спрашиваю в вопросе.

  2. Использовать динамические столбцы, например, выбрать A["Data"] как A["Name"]? Как ни странно, U-SQL просит вас назвать столбцы заранее, иначе это была бы замечательная функция.

Любой другой подход, который вы видите для обработки: любое количество столбцов в файлах, отсутствующие столбцы, несоответствие количества столбцов в разных файлах JSON?

Пример ввода:

[
  {
    "PID": "10201820",
    "System": [
      {
        "Name": "EventName",
        "Value": "SystemEvent"
      },
      {
        "Name": "Name",
        "Value": "Test"
      },
    ],
    "Domain": [
      {
        "Name": "Type",
        "Value": "ENTER"
      },
      {
        "Name": "startTime",
        "Value": "1/10/2018 11:21:10 AM"
      }
    ],
    "Custom": [
      {
        "Name": "platform",
        "Value": "Windows"
      },
      {
        "Name": "sys:eventts",
        "Value": "2018-01-10T11:21:10.440Z"
      },
      {
        "Name": "sys:mguid",
        "Value": "e236426e-a246-3e99f4f9bf95"
      },

      {
        "Name": "bus:AS2",
        "Value": "TestAs2From"
      },
      {
        "Name": "bus:AS3",
        "Value": "TestAs2To"
      },
      {
        "Name": "bus:Message-ID",
        "Value": "efd4-46bf-b11d-d838b4540aba"
      }
    ],
    "ttl": 8640000
  },



 {
    "PID": "201870",
    "System": [
      {
        "Name": "EventName",
        "Value": "SystemEvent"
      }
    ],
    "Domain": [
      {
        "Name": "Type",
        "Value": "ENTER"
      }
    ],
    "Custom": [
      {
        "Name": "sys:MachineName",
        "Value": "TestMachine"
      },
      {
        "Name": "cor:OriginalMessageId",
        "Value": "336-b102-4002-a7cc-36132e97"
      }
    ],
    "ttl": 8640000
  },

  {Similar rows as the one above just with some fields missing, some added}
]

Пример вывода:

All Data Fields (CSV): PID System.EventName System.Name Custom.Type ...TTL

 ...Corresponding Values or 0 if field not present in a row of the json ...................

person mourinho    schedule 20.03.2018    source источник
comment
Как я и другие спрашивали в других связанных темах: предоставьте простой входной файл и ожидаемый результат. Ваш вопрос очень широк и на него трудно ответить. Поскольку вы можете выбрать любые данные из документа JSON в набор строк, вы можете просто использовать реляционные фильтры для извлеченных строк. Например, вы можете использовать JsonFunctions.JsonTuple для извлечения значения внутри предложения WHERE.   -  person Michael Rys    schedule 21.03.2018
comment
Кроме того, U-SQL, как и все другие языки SQL, не предоставляет динамических имен столбцов. Вам придется либо упаковать динамические пары ключ/значение в SqlMap, либо явно назвать их. например, здесь есть примеры: stackoverflow.com/questions/49362635/   -  person Michael Rys    schedule 21.03.2018
comment
@MichaelRys Привет, Майкл, спасибо за ответы. Мои данные отформатированы довольно плохо, но я не могу этого изменить. Я дал точную пару ввода-вывода в РЕДАКТИРОВАТЬ. Моя проблема в том, что мой запрос терпит неудачу в случае, если данные не вписываются в мою схему... я действительно не знаю, сколько столбцов там будет... я не знаю, какие имена столбцов будут там точно. ... вот почему я пытался фильтровать... пожалуйста, посмотрите, как получить данные json в плоские файлы csv. Спасибо за вашу помощь.   -  person mourinho    schedule 21.03.2018
comment
@MichaelRys, пожалуйста, дайте мне знать, если я могу добавить больше деталей. Спасибо.   -  person mourinho    schedule 21.03.2018
comment
Спасибо... вы знаете априори названия событий, с которыми вы можете столкнуться? Кроме того, как я уже говорил в другой ветке: это один из худших способов управления парами ключ/значение в JSON. Весь смысл полуструктурированных форматов, таких как JSON, заключается в том, что вы можете использовать имя в качестве имени свойства и значение в качестве значения свойства. Есть ли шанс упростить формат JSON в исходном коде?   -  person Michael Rys    schedule 21.03.2018
comment
@MichaelRys, спасибо, у меня есть ГБ таких данных. Не могу изменить файлы. Да, априори, я могу заглянуть в файлы и получить имена некоторых полей, которые должны быть в CSV. Вот почему я пытался отфильтровать набор строк.   -  person mourinho    schedule 21.03.2018
comment
@MichaelRys да, я априори знаю, с какими именами событий я могу столкнуться. просто некоторые из них будут отсутствовать. неудобное форматирование json вызывает проблемы. не могли бы вы поделиться скриптом с этими данными в качестве образца. Большое спасибо за помощь.   -  person mourinho    schedule 21.03.2018