Amazon SimpleDB - есть ли способ перечислить все атрибуты в домене? - PullRequest
2 голосов
/ 05 мая 2010

Я использую C # и библиотеку AWSSDK из Amazon, чтобы протестировать несколько вещей в SimpleDB. Пока все идет хорошо.

Однако я пытаюсь найти удобный способ получения всех атрибутов, применимых к домену. Это оказывается непросто без необходимости извлекать Item, и, очевидно, я могу получить список атрибутов. Но что, если у меня есть 100 000 элементов в домене. Допустим, первые 70 000 элементов в домене «Person» имеют:

Имя, Фамилия, Адрес

И затем я поражаю предмет, у которого есть

Имя, Фамилия, Адрес, Телефон

А затем я поражаю другой предмет около отметки 80 000, который имеет:

Имя, Фамилия, Электронная почта, Телефон

В приведенном выше примере для Персонального домена как получить список, содержащий:

Имя, Фамилия, Адрес, Электронная почта, Телефон

... без выполнения нелепого числа отборных утверждений?

Большое спасибо!

1 Ответ

2 голосов
/ 05 мая 2010

Вы должны быть в состоянии получить очень точный список атрибутов, используя метод случайной выборки для доменов со многими элементами. Вот некоторый псевдокод на 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);

Это зависит от того, что вы можете использовать NextToken, возвращенный из запроса select count (*), для пропуска записей в SimpleDB. Mocky написал отличное объяснение того, как этого добиться . И я объяснил , как добиться такой эффективной подкачки с помощью Simple Savant .

Это даст вам 99% точности с большинством наборов данных, что должно быть достаточно для большинства реальных применений. Статистическая теория гласит, что размер выборки 2500 фактически обеспечивает одинаковую точность для любого набора данных размера, поэтому этот метод масштабируется даже для миллионов элементов.

Это, очевидно, не идеально, поскольку все еще требует большого количества запросов, но вы должны быть в состоянии выполнить то же самое с гораздо меньшим размером выборки, если ваш набор данных имеет относительно ограниченное количество вариаций атрибутов.

...