我正在将状态为 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/