我一直以Azure Blob Storage
的格式将来自不同设备的消息以AVRO格式存储。
其中一台设备出现故障,最终转储了“垃圾”消息。现在有一个任务可以搜索和删除特定设备中的消息。因此,我写了下面的代码。
遍历Blob
中的每个containers
并找到消息
foreach (var container in client.ListContainers(null, ContainerListingDetails.All))
{
if (permissions.PublicAccess == BlobContainerPublicAccessType.Blob || permissions.PublicAccess == BlobContainerPublicAccessType.Container)
{
//for each blob
foreach (var blobItem in container.ListBlobs(null, true))
{
if (blobItem is CloudBlockBlob)
{
string blobname = ((CloudBlockBlob)blobItem).Name;
var blob = container.GetBlockBlobReference(blobname);
using (var myBlob = blob.OpenRead())
{
using (var reader = AvroContainer.CreateGenericReader(myBlob))
{
while (reader.MoveNext())
{
foreach (dynamic avroRecord in reader.Current.Objects)
{
var eventData = new AvroEventData(avroRecord);
var jsonString = Encoding.UTF8.GetString(eventData.Body);
JObject _json = JObject.Parse(jsonString);
//DeserializeObject and check the device ID
// if found, then delete
// but how do I delete? do I get reference here?
}
}
}
}
}
}
}
}
以上代码,能够基于消息ID查找消息,但是现在如何删除它? reader
可能无法删除!
注意:我不想删除整个blob
,因为它可能包含来自其他工作设备的消息。
答案 0 :(得分:1)
我之前也遇到过类似的问题(但它不是avro格式),经过谷歌的研究和搜索后,我发现在以天蓝色托管时,很难修改blob。
我的解决方案是将文件下载到本地,然后根据您的代码对其进行修改,最后您可以将修改后的文件上传到Azure Blob存储中。所有步骤都可以通过代码完成。
希望有帮助。