【问题标题】:Get duplicate values from Azure Table Storage从 Azure 表存储中获取重复值
【发布时间】:2013-09-04 17:02:56
【问题描述】:

如何在Azure Table Storage 上查询重复值?

假设表包含一个名为“LastName”的列,并且有几个彼此相等的姓氏。在不知道或拥有包含姓氏值的特定string 的情况下如何查询?

编辑 一个例子是:

Partitionkey RowKey LastName
1            1      Smith
1            2      Smith
1            3      Smith
1            3      MILLER
1            3      WILLIAMS

在这种情况下,我想获取所有姓氏为 Smith 的记录,因为它们是重复的。

【问题讨论】:

  • 你能举个例子吗?
  • 看我的问题,它是用一个例子编辑的。

标签: c# azure duplicates azure-storage


【解决方案1】:

作为一般经验法则:不包含PartitionKeyRowKey 的查询不会执行得很好。

我假设您的 LastName 列既不是 Partition- 也不是 RowKey。在这种情况下,您只有不好的选择。表存储的工作方式是将分区的实体存储在一起,因此最快的查询是那些包含您要查找的实体的分区键的查询。由于您无法在任何其他列上构建索引,因此所有不包含 RowKey 的查询都将是分区扫描,即根本不会执行良好,因为必须分析该分区的所有行。

在您的情况下,如果您正在查找所有包含重复值的列,那么您最好的选择可能是只查询所有内容并在本地查找重复项。

我不认为您可以创建会返回结果的表存储查询。据我所知,没有select … where count(select duplicates) > 1 这样的东西——即使是这样,查询也会很慢。除非我们谈论的是海量数据,否则简单地查询所有内容并在本地进行过滤可能会更好。

正如我所说,你只有糟糕的选择。那是因为表存储不是为这样的查询而设计的。与 SQL 表不同,表存储表在设计时应考虑到查询,即在设计表之前您应该知道如何查询表。

您的第二个选择是迁移到 Azure SQL,这样的查询完全没有问题。 Azure SQL 与表存储有很大不同,因此它是否符合您的要求值得怀疑。

编辑:优化查询一切解决方案的一种方法是仅返回实体的姓氏(+ Partition/RowKey 或您需要的任何其他内容)。这样,发送的数据量可能会减少很多。 Here's 一篇关于查询投影的文章,详细解释了这种技术。

【讨论】:

  • 澄清一下:没有行键的查询将导致 partition 扫描,而不是 table 扫描。
  • 我忘了说查询会在某个分区执行。只是没有行键。
  • @David Makogon:你说得对,当我说“表”扫描时,我应该澄清一下。我会更新答案。
  • @Quoter:即便如此,目前也无法创建这样的查询。您可以通过多种方式解决此问题,但它们在很大程度上取决于您的应用程序 - 我们需要更多上下文来帮助您。例如,您可以以冗余方式存储查找数据,例如以 LastName 作为 RowKey 并将计数作为值存储一个附加行,并增加或减少插入和删除操作的计数。这使 DML 操作变得非常复杂,更不用说同步风险,但它会极大地提高您的查询。有很多陷阱,如果你有更多的插入/删除比
  • [cont.] 查询那么它甚至不值得。如果有其他选择,我会避免这样做,但由于存储很便宜,而且如果您执行的查询比 DML 操作多得多,那么这种方法可能是值得的。再说一次,如果 SQL Azure 是您的选择,我更喜欢它。您是否必须执行许多类似的查询?如果您绝对需要这些查询,也许您可​​以研究 SQL Azure 和分片而不是表存储?
【解决方案2】:

获取所有记录的查询应该是

PartitionKey eq 'Your PartitionKey' and LastName eq 'Smith'

除非我错过了什么。

您还需要考虑表格延续标记。有关详细信息,请参阅此线程:Copy all Rows to another Table in Azure Table Storage。正如@enzi 提到的,表存储中没有Select * from table where ... 功能可用。

【讨论】:

  • 我知道这个查询会起作用,但我的问题是我不知道哪个姓氏是重复的。查询本身应该找出哪个姓氏是重复的。那么这似乎是不可能的?
猜你喜欢
  • 2012-09-30
  • 2020-12-12
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2014-12-27
  • 2015-11-04
相关资源
最近更新 更多