获得"实体已经存在"将聚合写入Azure表存储(使用Azure功能)时出错

时间:2017-01-20 16:10:41

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

在Azure功能中,我尝试聚合一些数据并将聚合写入表格。

我有一个汇总数据的查询:

var query = recs
            .GroupBy(r => new { r.Category, r.Account, r.Record })
            .Select(r => new ts_webhitaggregate_account
                    {
                        PartitionKey = partition,  // Constant
                        RowKey = $"{r.Key.Category}:{r.Key.Account}:{r.Key.Record}", // Group By 
                        rawDate = intervaldate,   // Constant
                        epochDate = intervalepoch, // Constant
                        Category = r.Key.Category, // Group By 
                        Account = r.Key.Account, // Group By 
                        Record = r.Key.Record, // Group By 
                        Hits = r.Count(), // Aggregate
                        Users = r.Select(t => t.User).Distinct().Count(), // Aggregate
                        Devices = r.Select(t => t.Device).Distinct().Count() // Aggregate
                    });

然后我尝试将这些记录传递给ICollector绑定表

foreach (ts_webhitaggregate_account a in query.ToList())
{
    webhitsAggAccount.Add(a);
}

我经常遇到一个"实体已经存在"错误如:

  

调用目标抛出了异常。 Microsoft.WindowsAzure.Storage:82:指定的实体已存在。

如果我正在向C#编写类似的SQL语句,我不会期望复合键的重复是可能的,因为正在写入的每个值都是键,常量或聚合。我也没有表中可能导致冲突的预先存在的数据。

在我的查询中生成重复内容我做错了什么?

3 个答案:

答案 0 :(得分:1)

我相信我找到了我愚蠢的地方......这些发生在类别的循环中,我应该每次都选择一个类别,但行键上的一个范围选择包括另一个类别然后继续被选中,两次插入第二类。

如有疑问,请将所有内容打印到控制台!

答案 1 :(得分:0)

错误消息告诉我们已经存在的实体。据我所知,该集合似乎有一个具有相同PartitionKey和RowKey的实体。请尝试使用insert or update method查看是否可以为您提供帮助。

答案 2 :(得分:0)

只是一个侧面评论,可能对您有所帮助进行调试。在您粘贴的错误消息中“82:指定的实体已存在”。数字82是批处理操作中有问题(重复)项目的索引。