0

我正在尝试根据我的过滤器检索 blob,因为我在 iot-hub 中创建了一个设备,该设备正在接收遥测数据并将其作为 blob 路由到存储帐户。现在我想使用 Nodejs 检索 blob。

有没有可能我可以编写一个 API 来根据过滤器过滤掉我的 blob 而无需遍历整个 blob 容器?

4

1 回答 1

1

默认情况下,Azure 存储路由{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}在所选容器内创建具有约定的 blob 。因此,您有一个可预测的 blob 前缀,可以在查询过滤器中使用(稍后会详细介绍)。这里要注意的一件事是摄取分区{partition}消息的零索引分区 id 。例如,如果您在创建 IoT 中心实例时选择了 4 个分区(默认),则分区 ID 将为 0、1、2 和 3。

现在进入过滤器部分的查询。通常,您很可能希望根据时间范围列出 blob(并进一步阅读内容),因为这在您的冷路径分析中非常实用。不幸的是,您将无法按设备 ID 过滤 blob,因为同一个 blob 可能包含来自多个设备的消息。因此,假设您的冷路径分析将处理具有滑动时间范围的批处理(很可能是一些连续的工作),下面是使用@azure/storage-blob包(v12 JavaScript )的示例查询(当然过度简化,请仔细阅读内联注释)开发工具包)。您应该检查API 参考以了解即兴创作的需要。

const blobServiceClient = BlobServiceClient.fromConnectionString('myStorageConnectionString');
const containerClient = blobServiceClient.getContainerClient('myContainer');

// Add logic here to select time range. 
// For simplicity I am selecting a hardcoded time range of 2020-1-1 5:45 pm to 2020-1-1 5:46 pm 
// (just 1 minute range)

// assuming IoT hub has 4 partitions
for (partition = 0; partition < 4; partition++) {
  // note below the prefix is picking up all blobs written at 17:45:00 to 17:45:59.xxx
  let iter = containerClient.listBlobsByHierarchy("/", { prefix: `myIotHub/${partition}/2020/01/01/17/45` });
  let entity = await iter.next();
  while (!entity.done) {
    let item = entity.value;
    if (item.kind === "prefix") {
      console.log(`\tBlobPrefix: ${item.name}`);
    } else {
      // At this point you might want to to read the blob content here. For simplicity I am just printing few blob properties below
      console.log(`\tBlobItem: name - ${item.name}, last modified - ${item.properties.lastModified}`);
    }
    entity = await iter.next();
  }
}

于 2020-11-24T18:34:41.343 回答