2

私は C# と AWSSDK ライブラリ フォーム Amazon を使用して、SimpleDB でいくつかのことをテストしています。これまでのところすべて順調です。

ただし、ドメインに適用可能なすべての属性を取得するきちんとした方法を考え出そうとしています。これは、Item を取得しないと難しいことがわかりました。明らかに、属性のリストを取得できます。しかし、ドメインに 100,000 個のアイテムがある場合はどうでしょう。「Person」ドメインの最初の 70,000 個のアイテムが次のようになっているとします。

名、姓、住所

そして、私は

名、姓、住所、電話番号

そして、80,000 マークあたりで別のアイテムをヒットしました。

名、姓、電子メール、電話番号

上記の例では、Person ドメインの場合、次の内容を含むリストを取得するにはどうすればよいですか?

名、姓、住所、メールアドレス、電話番号

...ばかげた数の select ステートメントを実行せずに?

どうもありがとう!

4

1 に答える 1

2

多くの項目を持つドメインに対して、ランダム サンプリング アプローチを使用して、非常に正確な属性のリストを取得できるはずです。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 は、これを達成する方法について優れた説明を書いています。そして、このような効率的なページングを Simple Savant で実現する方法を説明しました。

これにより、ほとんどのデータセットで 99% の精度が得られ、ほとんどの実世界での使用に十分なはずです。統計理論によると、サンプル サイズが 2500 の場合、どのサイズのデータ​​ セットでも実質的に同じ精度が得られるため、この方法は数百万のアイテムにも適用できます。

依然として多数のクエリが必要なため、これは明らかに理想的ではありませんが、データ セットの属性バリエーションの数が比較的限られている場合は、はるかに小さいサンプル サイズで同じことを達成できるはずです。

于 2010-05-05T17:05:20.043 に答える