【问题标题】:Azure IOT Apache Avro formatAzure IOT Apache Avro 格式
【发布时间】:2018-02-27 16:47:54
【问题描述】:

使用 Azure IOT,我的设备端点指向 Azure Blob 存储。数据被发送到 Blob,但我得到非 ascii 字符,并被告知文件扩展名不正确。示例 Blob 数据为

Objavro.codecnullavro.schemaÐ{"type":"record","name":"Message","namespace":"Microsoft.Azure.Devices","fields":[{"name":"EnqueuedTimeUtc","type":"string"},{"name":"Properties","type":{"type":"map","values":"string"}},{"name":"SystemProperties","type":{"type":"map","values":"string"}},{"name":"Body","type":["null","bytes"]}]} ±¡RëZË8耑,¡…$• à82018-02-20T15:12:16.1060000Z $connectionDeviceIdLane4Free(connectionAuthMethodœ{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}8connectionDeviceGenerationId$636543931333384343enqueuedTime82018-02-20T15:12:16.1060000Z d{"deviceId": "myPythonDevice","PinsCCC": 302.00,\}82018-02-20T15:12:16.2000000Z

Azure IOT 文档说格式是 Apache Avro,但我找不到任何关于如何解码非 ascii 字符的信息。我看不到在哪里指定 json 扩展名。

【问题讨论】:

  • 如何发送数据?
  • 这是我使用的 Python 代码。 -- message = IoTHubMessage((msg_txt_formatted)) --- message.ContentEncoding = "utf-8"; --- message.ContentType = "应用程序/json" ---; client.send_event_async(message, send_confirmation_callback, message_counter)
  • 重新格式化 - 这是使用 MQTT 的 Python 代码。 message =IoTHubMessage((msg_txt_formatted)) message.ContentEncoding = "utf-8"; message.ContentType = "application/json" ;`client.send_event_async(message, send_confirmation_callback, message_counter)``

标签: azure iot avro


【解决方案1】:

好像是by designed

您可以利用 Avro 工具读取或转换为 JSON 格式。

这是一个Python sample 来读取 Avro 文件。

【讨论】:

  • 我使用 avro-python3 创建了示例 capturereader.py。代码找到我的 blob 位置 下载了一个非空 blob:DuckpinFree/01/2018/02/20/17/03 但在读取 raw_decode obj, end = self.scan_once(s, idx) 中的 blob 时失败并出现错误 json.decoder.JSONDecodeError : 在第 1 行第 46 列需要用双引号括起来的属性名称。上面的数据将第 46 列很好地放在双引号 json 中。??
  • 我相信我看到了问题所在。上面我的数据的第 2 行(第一行是标题数据)在大约 46 列包含一个非 json 对。IOTHub 将它传递给 blob 存储,但由于它不是 json,我无法使用 Python 事件中心阅读器读取它。
  • @CliffordEby 更正代码后你能读取有效的 JSON 消息吗?
  • 所编写的示例 capturereader.py 代码会从 Blob 存储中下载并删除所有数据。数据将写入本地客户端目录中的单个文件。非 ascii 字符仍然存在于 Xs 和数据中的其他位置 - ObjXXXavro.codecXnullXavro.schemaÐX 我在 avro 规范中没有看到任何关于非 ascii 的内容,我想知道是什么将它们放在那里以及为什么?
  • Storage Explorer 提供了 GUI 界面和选择性下载功能。分析存储在 Blob 存储中的 IOT 数据的推荐工具是什么?
【解决方案2】:

从您最初的问题来看,您似乎需要从 ARVO 文件中读取内容。以下是使用 C# 从 Azure 存储中执行此操作的步骤:

  1. 安装 Microsoft.Avro.Core nugget 包

  1. 添加以下命名空间:

    using Microsoft.Hadoop.Avro;
    using Microsoft.Hadoop.Avro.Container;
    
  2. 获取 AVRO 记录

    private async Task<List<AvroRecord>> GetAvroRecordsAsync(CloudBlockBlob cloudBlockBlob)
    {
        var memoryStream = new MemoryStream();
        await cloudBlockBlob.DownloadToStreamAsync(memoryStream);
        memoryStream.Seek(0, SeekOrigin.Begin);
        List<AvroRecord> avroRecords;
        using (var reader = AvroContainer.CreateGenericReader(memoryStream))
        {
            using (var sequentialReader = new SequentialReader<object>(reader))
            {
                  avroRecords = sequentialReader.Objects.OfType<AvroRecord>().ToList();
            }
        }
    
        return avroRecords;
    }
    
  3. 从 avro 记录中反序列化对象:

    private MyObject GetMyObject(AvroRecord avroRecord)
    {
        var body = avroRecord.GetField<byte[]>("Body");
        var dataBody= Encoding.UTF8.GetString(body);
        var myObj= JsonConvert.DeserializeObject<MyObject>(dataBody);
        return myObj;
    }
    

希望这对你有帮助。

【讨论】:

  • 上面的 Python 示例使我能够读取和淡化 AVRO 格式。这可能是 @Stinky Towel 正在寻找的。
    我还没有找到任何解释 Azure IOT 插入的非 ascii 字符的内容。此外,我希望 PowerBi 完全支持 Blob 存储中的 json 对象,从而简化从 Blob 存储中下载数据。目前,它非常笨拙。谢谢回复
猜你喜欢
  • 2022-01-14
  • 2019-07-25
  • 2019-07-12
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多