我正在使用C#和Amazon的AWSSDK库来测试SimpleDB中的一些功能。到目前为止一切顺利。

但是,我试图提出一种巧妙的方法来检索适用于域的所有属性。事实证明,在不必检索Item的情况下这很棘手,显然,我可以得到属性列表。但是,如果我在一个域中有100,000个项目怎么办。假设“人员”域中的前70,000个项目具有:

名字,姓氏,地址

然后我打了一个有

名字,姓氏,地址,电话

然后我击中了另一个在80,000左右的物品,它具有:

名字,姓氏,电子邮件,电话

在上面的示例中,对于人员域,我将如何获取包含以下内容的列表:

名,姓,地址,电子邮件,电话

...没有执行大量的选择语句?

非常感谢!

最佳答案

对于包含许多项目的域,您应该能够使用随机抽样方法获得高度准确的属性列表。这是一些C#伪代码:

int domainCount = "select count(*) from Person";
int avgSkipCount = domainCount/2500;
int processedCount = 0;
string nextToken = null;
Set attributeNames;

do
{
  int nextSkipCount = Random.Next(0, avgSkipCount*2);
  string nextToken = "select count(*) from Person limit " + nextSkipCount;
  var countRequest = new SelectRequest
  {
    NextToken = nextToken,
    SelectExpression = "select count(*) from Person limit " + nextSkipCount
  };
  var countResponse = SimpleDb.Select(countRequest);
  nextToken = countResponse.NextToken;
  processedCount += countResponse.Count;

  var getRequest = new SelectRequest
  {
    NextToken = nextToken,
    SelectExpression = "select * from Person limit 1"
  };
  var getResponse = SimpleDb.Select(getRequest);
  nextToken = getResponse.NextToken;
  processedCount++;

  attributeNames.Add(getResponse.AttributeNames);

} while (domainCount > processedCount);


这取决于您可以使用从select count(*)查询返回的NextToken跳过SimpleDB中的记录的事实。 Mocky写了an excellent explanation of how to accomplish this。我已经解释了how to accomplish efficient paging like this with Simple Savant

对于大多数数据集,这将为您提供99%的准确性,这对于大多数实际用途而言应足够好。统计理论认为,对于任何大小的数据集,2500的样本量实际上都能为您提供相同的准确度,因此该方法甚至可以扩展到数百万个项目。

这显然是不理想的,因为它仍然需要大量查询,但是如果您的数据集具有相对有限数量的属性变体,则应该能够以较小的样本量完成相同的任务。

10-05 20:59
查看更多