U-SQL ТОЛЬКО извлекает определенные данные из JSON

У меня есть файл JSON, который содержит массив объектов

{
  [ 
    {id:1, a:4},
    {id:2, a:7},
    {id:3, a:5},
    {id:4, a:9}
  ]    
}

Как я могу написать скрипт U-SQL, чтобы извлечь только первый объект {id:1, a:4}

Не удалось найти в документах сборки JSON, если JsonExtractor фактически принял в качестве аргумента строку JSONPath, но он принимает строку, а для чтения из других публикаций - строку, подобную JSONPath

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 

USING Microsoft.Analytics.Samples.Formats.Json;

DECLARE @InputPath string = "filepath.json"

@RawData = 
    EXTRACT id     int,
            a      int
    FROM @InputPath
    USING new JsonExtractor("$[:1]");

ПРИМЕЧАНИЕ. Эти объекты не являются реальными объектами. Мои требования, чтобы получить первый из массива. Нет возможности, где поле для сопоставления

2 ответа

Решение

Нашел ответ.

Оказывается, что JsonExtract действительно получает строковый параметр, который является JSONPath, но когда вы используете файл, подобный показанному, где первый элемент является безымянным массивом, он предполагает, что каждый объект - это отдельный JSON.

Здесь вы можете найти проблему, которая заявляет о проблеме


На мой взгляд, у вас есть 2 выхода:

Реализуйте свой собственный экстрактор, который обрабатывает этот случай.

или же

Восстановите ваш входной JSON, если можете, чтобы назвать массив.

{
  data: [ 
    {id:1, a:4},
    {id:2, a:7},
    {id:3, a:5},
    {id:4, a:9},
  ]
}

а затем вы можете использовать JsonPath для извлечения определенной части JSON, как так

@RawData = 
  EXTRACT id     int,
          a      int
  FROM @InputPath
  USING new JsonExtractor("$.data[0]");

Получение в результате id: 1, a:4

Если значение id всегда последовательное, начиная с 1, вы можете использовать предложение WHERE:

@RawData = 
    EXTRACT id     int,
            a      int
    FROM @InputPath
    USING new USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();

@CleanData
    SELECT  id    int,
            a     int
    FROM @RawData
    WHERE id == 1;
Другие вопросы по тегам