Azure 存储表中的批量插入
Posted
技术标签:
【中文标题】Azure 存储表中的批量插入【英文标题】:Batch Insert in Azure storage table 【发布时间】:2019-03-16 03:35:04 【问题描述】:我是使用 azure 存储表的新手。我试图批量插入我的实体,但我发现你不能使用不同的分区键进行批量操作。
有什么方法可以让我想在表格中插入大约 10,000 - 20,000 个文件详细信息。
这是我迄今为止尝试过的:
public class Manifest:TableEntity
private string name;
private string extension;
private string filePath;
private string relativePath;
private string mD5HashCode;
private string lastModifiedDate;
public void AssignRowKey()
this.RowKey = relativePath.ToString();
public void AssignPartitionKey()
this.PartitionKey = mD5HashCode;
public string Name get return name; set name = value;
public string Extension get return extension; set extension = value;
public string FilePath get return filePath; set filePath = value;
public string RelativePath get return relativePath; set relativePath = value;
public string MD5HashCode get return mD5HashCode; set mD5HashCode = value;
public string LastModifiedDate get return lastModifiedDate; set lastModifiedDate = value;
我的方法在不同的类中:
static async Task BatchInsert(CloudTable table, IEnumerable<FileDetails> files)
int rowOffset = 0;
var tasks = new List<Task>();
while (rowOffset < files.Count())
// next batch
var rows = files.Skip(rowOffset).Take(100).ToList();
rowOffset += rows.Count;
var task = Task.Factory.StartNew(() =>
var batch = new TableBatchOperation();
foreach (var row in rows)
Manifest manifestEntity = new Manifest
Name = row.Name,
Extension = row.Extension,
FilePath = row.FilePath,
RelativePath = row.RelativePath.Replace('\\', '+'),
MD5HashCode = row.Md5HashCode,
LastModifiedDate = row.LastModifiedDate.ToString()
;
manifestEntity.AssignPartitionKey();
manifestEntity.AssignRowKey();
batch.InsertOrReplace(manifestEntity);
// submit
table.ExecuteBatch(batch);
);
tasks.Add(task);
await Task.WhenAll(tasks);
【问题讨论】:
【参考方案1】:如果要使用批处理操作,批处理中的实体必须具有相同的 PartitionKey。不幸的是,没有其他选择,只能将它们单独保存在您的情况下。
甚至存在分区键的原因是 Azure 可以跨机器分发数据,而无需在分区之间进行协调。系统被设计成不能在同一个事务或操作中使用不同的分区。
您可以点赞这个issue 来推进这个功能的实现。
【讨论】:
【参考方案2】:相对而言,没有办法使用批处理操作在没有相同分区键的情况下插入多个实体。
批处理操作的一些限制是
单个批处理操作中的所有实体必须具有相同的分区 键。 单个批处理操作只能包含 100 个实体。或者,您可以使用“TableOperation.Insert()”插入实体,它允许您插入具有相同分区键的实体。
【讨论】:
我想你的意思是,没有相同的分区键。以上是关于Azure 存储表中的批量插入的主要内容,如果未能解决你的问题,请参考以下文章
从 Azure Blob 存储批量插入时出现 ERRORFILE 问题
Azure SQL - 从 Azure 文件而不是 Blob 批量插入