hadoop - 为什么 Mutation 不为现有列插入

标签 hadoop mapreduce cassandra thrift

我正在将状态为 crawled=0 的初始数据(爬虫的 url 列表)加载到 Cassandra。然后使用 Hadoop 我抓取所有链接并尝试将抓取从 0 更改为其他内容,例如 1 或 2,或 3。当我 checkin 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;
  }

最佳答案

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

 c.setTimestamp(System.currentTimeMillis());

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

关于hadoop - 为什么 Mutation 不为现有列插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890888/

相关文章:

hadoop - Hadoop是否在映射和reduce步骤之间使用HBase作为 “auxiliar”?

java - 如何在hadoop中将InputStream数据设置为FSDataInputStream

hadoop - 设置map任务和reduce任务的数量

Python - 在 MapReduce 中实现 join - reducer 输出问题

java - RDD 不可序列化 Cassandra/Spark 连接器 java API

python - 如何为以下内容写图归约

hadoop - 从配置单元表中选择具有给定条件的重复项的记录

在 MapReduce 中从自己的函数创建 Avro 对象时出现 java.lang.IllegalAccessError

cassandra - OpsCenter - 它如何与代理通信?

node.js - 如何通过node js运行cassandra的复杂sql