Я собираю данные в 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"}]

Похоже, вы используете 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; при необходимости отрегулируйте другую кодировку символов.
Рад это слышать, @XavierRodriguez. Поскольку данные хранятся в байтах, они могут представлять что угодно, а если это текст, то тот, кто создал данные, должен выбрать, какую кодировку символов использовать, хотя в наши дни очень распространена UTF-8.
Потрясающий! Он работает отлично. Я не знал и не знал о текстовой кодировке вывода avro. Спасибо.