Преобразование файла Avro в JSON с помощью PowerShell

Я собираю данные в avro через Azure EventHub, чтобы их можно было обрабатывать с помощью Runbook автоматизации Azure. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь проанализировать файл avro, который будет использоваться в сценарии PowerShell.

Здесь содержимое файла. введите сюда описание изображения

    Objavro.codecnullavro.schemaì{"type":"record","name":"EventData","namespace":"Microsoft.ServiceBus.Messaging","fields":[{"name":"SequenceNumber","type":"long"},{"name":"Offset","type":"string"},{"name":"EnqueuedTimeUtc","type":"string"},{"name":"SystemProperties","type":{"type":"map","values":["long","double","string","bytes"]}},{"name":"Properties","type":{"type":"map","values":["long","double","string","bytes","null"]}},{"name":"Body","type":["null","bytes"]}]} Êg;Ï7ˆ@žkß6Þ¿¼¬.

16904(6/25/2024 5:50:16 AM&x-opt-enqueued-time ¸–߉d  ²{"value":[{"subscriptionId":"5exxxxa10333","subscriptionExpirationDateTime":"2024-06-28T00:23:31.567249+00:00","changeType":"created","resource":"Users/2ffxxxx81-a8d0xxxx83c/Messages/AAMkAxxxxxB7VrlAAA = ","resourceData":{"@odata.type":"#Microsoft.Graph.Message","@odata.id":"Users/2ffxxxx-9f81-a8d****83c/Messages/AAMkAGY4xxxxxAAKB7VrlAAA = ","@odata.etag":"W/\"CQAAABYAAxxxxxA38cxAAKB/4Iw\"","id":"AAMkAxxxxxxlAAA = "},"clientState":"MlaxxxxyJ.MF7kmc3z","tenantId":"e1fxxxxxc83"}]}Êg;Ï7ˆ@žkß6Þ¿¼

Я попытался проанализировать файл с помощью модуля pwsh AvroTools, но командлет read-avro возвращает объект PSCustom, который я не могу использовать:

Fields        : {SequenceNumber, Offset, EnqueuedTimeUtc, SystemProperties…}
Count         : 6
SchemaName    : Microsoft.ServiceBus.Messaging.EventData
Name          : EventData
Namespace     : Microsoft.ServiceBus.Messaging
Fullname      : Microsoft.ServiceBus.Messaging.EventData
Documentation :
Tag           : Record

При проверке полей под содержимым:

Aliases       :
Pos           : 0
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : {"type":"long"}
Name          : SequenceNumber

Aliases       :
Pos           : 1
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : {"type":"string"}
Name          : Offset

Aliases       :
Pos           : 2
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : {"type":"string"}
Name          : EnqueuedTimeUtc

Aliases       :
Pos           : 3
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : {"type":"map","values":["long","double","string","bytes"]}
Name          : SystemProperties

Aliases       :
Pos           : 4
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : {"type":"map","values":["long","double","string","bytes","null"]}
Name          : Properties

Aliases       :
Pos           : 5
Documentation :
DefaultValue  :
Ordering      : ignore
Schema        : ["null","bytes"]
Name          : Body

Я хотел бы получить содержимое в формате JSON, например:

[{"subscriptionId":"5e6eec86-xxxxxxxxxxxxx-f7xxxx333","subscriptionExpirationDateTime":"2024-06-28T00:23:31.567249+00:00","changeType":"created","resource":"Users/2ff83-fxxxxxxxxxxxx-a8d0afceb83c/Messages/AAMkAGY4ZTZlNTI1xxxxxxxxxxxxxxxxxxxtRXSbFa_gJA38cxAAKB7VrlAAA = ","resourceData":{"@odata.type":"#Microsoft.Graph.Message","@odata.id":"Users/2ff-xxxxxxxxxxxx81-a8d0afceb83c/Messages/AAMkAGY4ZxxxxxxxxxxxxxxxxxxxxxxxxCeBfyMDtRXSbFa_gJA38cxAAKB7VrlAAA = ","@odata.etag":"W/\"CQAAABYAAACeBfyMDtRXSbFa+gJA38cxAAKB/4Iw\"","id":"AAMkAGY4ZTZxxxxxxxxxxxxxxxxxxxxxxxxbFa_gJA38cxAAKB7VrlAAA = "},"clientState":"Mla8Q~xxxxxxxxxxxxxxxxxxxxxxxMF7kmc3z","tenantId":"e1f8axxxxxxxxxxxxxxxxxxxxc83"}]
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы используете Read-AvroSchema, а не Read-Avro для анализа файла (оба командлета являются частью модуля AvroTools, который можно установить, например, с помощью Install-Module -Scope CurrentUser AvroTools):

  • Read-AvroSchema считывает метаданные (структурные данные, например схему базы данных) из файла-контейнера объектов Avro (*.avro), тогда как
  • Read-Avro считывает данные в виде экземпляров [pscustomobject] (тип PowerShell для динамически создаваемых объектов «мешка свойств»), свойства которых отражают поля во входных данных Avro.

Не имея доступа к исходным данным в их исходной форме (то, что указано в вашем вопросе, недействительно в качестве содержимого файла *.avro), я думаю, что сработает следующее:

# Extract the value of the "Body" field, assumed to be the JSON of interest
# as bytes representing UTF-8 encoding.
[System.Text.Encoding]::UTF8.GetString(
  (Read-Avro yourFile.avro).Body
)

Примечание:

  • Я предполагаю, что поле Body содержит интересующий текст JSON.

  • Поскольку в списках информации о типе этого поля указано ["null", "bytes"], я предполагаю, что значение передается как массив байтов.

  • Я также предполагаю, что байты представляют собой кодировку UTF-8 текста JSON; при необходимости отрегулируйте другую кодировку символов.

Потрясающий! Он работает отлично. Я не знал и не знал о текстовой кодировке вывода avro. Спасибо.

Xavier Rodriguez 27.06.2024 07:24

Рад это слышать, @XavierRodriguez. Поскольку данные хранятся в байтах, они могут представлять что угодно, а если это текст, то тот, кто создал данные, должен выбрать, какую кодировку символов использовать, хотя в наши дни очень распространена UTF-8.

mklement0 27.06.2024 18:27

Другие вопросы по теме