为什么Mutation不为现有列插入

时间:2011-07-31 16:57:10

标签: hadoop mapreduce cassandra thrift

我正在将状态为crawled = 0的Cassandra加载初始数据(抓取工具的网址列表)。然后使用Hadoop我抓取所有链接并尝试将其从0迁移到其他地方,例如1或2,或3.当我签入Cassandra cli界面时获取ColumnFamily ['www.somedomain.com']爬虫的值列保持不变。如果在初始导入期间我没有提到爬行列,则会正确添加。这只是算法的一部分,我需要使用其他Map / Reduce作业等进一步更新此列。

在Thrift和Cassandra API中,据说我们只有插入和删除。插入应该作为更新。

对于已爬网列,我有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 个答案:

答案 0 :(得分:2)

Cassandra使用突变的时间戳解决冲突,获得最大的时间戳。您可以将timestamp值设置为您想要的任何值,但约定是将时间戳设置为以微秒为单位的值。在上面的示例中,您使用

设置时间戳
 c.setTimestamp(System.currentTimeMillis());

填充值的初始导入代码很可能是以微秒为单位设置时间戳。微秒时间戳值大于毫秒时间戳值,因此您的更新将被忽略。