почему мутация не делает вставки для существующих столбцов - PullRequest
1 голос
/ 31 июля 2011

Я загружаю исходные данные (список URL для сканера) в Cassandra со статусом crawled = 0.Затем, используя Hadoop, я сканирую все ссылки и пытаюсь изменить сканируемый объект с 0 на что-то другое, например, 1, 2 или 3. Когда я проверяю в Cassandra cli interface, получаем ColumnFamily ['www.somedomain.com'] значение crawler.столбец остается прежним.Если при первоначальном импорте я не упомянул просканированный столбец, он добавляется правильно.Это только одна часть алгоритма, и мне нужны дальнейшие обновления этого столбца с другими заданиями Map / Reduce и т. Д.

В API Thrift и Cassandra сказано, что у нас есть только вставки и удаления.Вставка должна работать как обновление.

Для просканированного столбца у меня тип UTF8.

Класс мутации выглядит следующим образом:

  private static Mutation getMutationCrawled(Text crawledVal)
  {
      Text column = new Text();
      column.set("crawled");

      Column c = new Column();

      c.setName(ByteBuffer.wrap(Arrays.copyOf(column.getBytes(), column.getLength())));
      c.setValue(ByteBuffer.wrap(crawledVal.getBytes()));
      c.setTimestamp(System.currentTimeMillis());

      Mutation m = new Mutation();
      m.setColumn_or_supercolumn(new ColumnOrSuperColumn());
      m.column_or_supercolumn.setColumn(c);

      return m;
  }

1 Ответ

2 голосов
/ 31 июля 2011

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

 c.setTimestamp(System.currentTimeMillis());

Скорее всего, исходный код импорта для заполнения значений - это установка метки времени в микросекундах. Значения микросекундной метки времени превышают значения метки миллисекунды, поэтому ваши обновления игнорируются.

...