【问题标题】:Batch Insert in Azure storage tableAzure 存储表中的批量插入
【发布时间】: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);
}

【问题讨论】:

    标签: c# azure azure-storage azure-table-storage azure-tablequery


    【解决方案1】:

    如果要使用批处理操作,批处理中的实体必须具有相同的 PartitionKey。不幸的是,没有其他选择,只能将它们单独保存在您的情况下。

    甚至存在分区键的原因是 Azure 可以跨机器分发数据,而无需在分区之间进行协调。系统被设计成不能在同一个事务或操作中使用不同的分区。

    您可以点赞这个issue 来推进这个功能的实现。

    【讨论】:

      【解决方案2】:

      相对而言,没有办法使用批处理操作在没有相同分区键的情况下插入多个实体。

      批处理操作的一些限制是

      • 单个批处理操作中的所有实体必须具有相同的分区 键。
      • 单个批处理操作只能包含 100 个实体。

      或者,您可以使用“TableOperation.Insert()”插入实体,它允许您插入具有相同分区键的实体。

      【讨论】:

      • 我想你的意思是,没有相同的分区键。
      猜你喜欢
      • 2021-11-26
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 2021-04-23
      • 2011-05-02
      相关资源
      最近更新 更多