删除 Azure 存储中的批处理操作

Delete batch operation in Azure Storage

我一直在尝试为 Azure 存储实体实现删除操作的 DAO 方法。使用 TableOperation 删除是可以的。

TableOperation deleteEntity = TableOperation.delete(entity);

但是当我尝试使用批量操作时,不支持。

非常感谢任何解决此问题的建议。

But when I tried it using Batch Operation, It was not supported.

我假设您可以按分区键对要删除的项目进行分组,然后执行 TableBatchOperation

这里我用C#语言写了一个helperclass来实现这个目的,你可以参考一下:

public class TableBatchHelper<T> where T : ITableEntity
{
    const int batchMaxSize = 100;

    public static IEnumerable<TableBatchOperation> GetBatchesForDelete(IEnumerable<T> items)
    {
        var list = new List<TableBatchOperation>();
        var partitionGroups = items.GroupBy(arg => arg.PartitionKey).ToArray();
        foreach (var group in partitionGroups)
        {
            T[] groupList = group.ToArray();
            int offSet = batchMaxSize;
            T[] entities = groupList.Take(offSet).ToArray();
            while (entities.Any())
            {
                var tableBatchOperation = new TableBatchOperation();
                foreach (var entity in entities)
                {
                    tableBatchOperation.Add(TableOperation.Delete(entity));
                }
                list.Add(tableBatchOperation);
                entities = groupList.Skip(offSet).Take(batchMaxSize).ToArray();
                offSet += batchMaxSize;
            }
        }
        return list;
    }

    public static async Task BatchDeleteAsync(CloudTable table, IEnumerable<T> items)
    {
        var batches = GetBatchesForDelete(items);
        await Task.WhenAll(batches.Select(table.ExecuteBatchAsync));
    }
}

那么,您可以按如下方式执行批量删除:

await TableBatchHelper<ClassName>.BatchDeleteAsync(cloudTable,items);

var batches = TableBatchHelper<ClassName>.GetBatchesForDelete(entities);
Parallel.ForEach(batches, new ParallelOptions()
{
    MaxDegreeOfParallelism = 5
}, (batchOperation) =>
    {
        try
        {
            table.ExecuteBatch(batchOperation);
            Console.WriteLine("Writing {0} records", batchOperation.Count);
        }
        catch (Exception ex)
        {
            Console.WriteLine("ExecuteBatch throw a exception:" + ex.Message);
        }
    });
public void deleteLocationsForDevice(String id) {
    logger.info("Going to delete location data for Device [{}]", id);

    // Create a filter condition where the partition key is deviceId.
    String partitionFilter = TableQuery.generateFilterCondition(
            PARTITION_KEY,
            TableQuery.QueryComparisons.EQUAL,
            id);

    // Specify a partition query, using  partition key filter.
    TableQuery<AzureLocationData> partitionQuery =
            TableQuery.from(AzureLocationData.class)
                    .where(partitionFilter);



    if (partitionQuery != null) {
        for (AzureLocationData entity : cloudTable.execute(partitionQuery)) {

            TableOperation deleteEntity = TableOperation.delete(entity);
            try {
                cloudTable.execute(deleteEntity);
                logger.info("Successfully deleted location records with : " + entity.getPartitionKey());
            } catch (StorageException e) {
                e.printStackTrace();
            }

        }

    } else {
        logger.debug("No records to delete!");
    }

    //  throw new UnsupportedOperationException("AzureIotLocationDataDao Delete Operation not supported");
}

不是,那是没有使用块操作的代码。以下是包含块操作的代码。抱歉没有提到

 TableBatchOperation batchOperation = new TableBatchOperation();
    List<TableBatchOperation> list = new ArrayList<>();

    if (partitionQuery != null) {
        for (AzureLocationData entity : cloudTable.execute(partitionQuery)) {

            batchOperation.add(TableOperation.delete(entity));
            list.add(batchOperation);    //exception thrown line
        }
        try {
            cloudTable.execute((TableOperation) batchOperation);
        } catch (StorageException e) {
            e.printStackTrace();
            }
            }