Hadoop和Cassandra-InvalidRequestException(原因:需要列时间戳)

Hadoop和Cassandra-InvalidRequestException(原因:需要列时间戳),hadoop,cassandra,Hadoop,Cassandra,我在Cassandra集群上运行了一个简单的映射作业,但当它试图将输出保存到表时,我得到了InvalidRequestException(原因:需要列时间戳) 我已经尝试过在CF中手动添加一个“timestamp”列,但没有任何区别 以下是我的CF说明(由cqlsh解释): 我正在使用POM,hadoop core v1.1.2和cassandra thrift v1.2.4在cassandra v1.2.4之上 有人能建议如何避开这个问题吗 其他信息 我正在按如下方式配置我的作业(仅显示与输出

我在Cassandra集群上运行了一个简单的映射作业,但当它试图将输出保存到表时,我得到了InvalidRequestException(原因:需要列时间戳)

我已经尝试过在CF中手动添加一个“timestamp”列,但没有任何区别

以下是我的CF说明(由cqlsh解释):

我正在使用POM,hadoop core v1.1.2和cassandra thrift v1.2.4在cassandra v1.2.4之上

有人能建议如何避开这个问题吗

其他信息

我正在按如下方式配置我的作业(仅显示与输出相关的配置):

还有我的减速机课:

public static class ReducerToCassandra extends Reducer<Text, IntWritable, ByteBuffer, List<Mutation>>
{
    public void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(StringSerializer.get().toByteBuffer(word.toString()), Collections.singletonList(getMutation(word, sum)));
    }

    private static Mutation getMutation(Text word, int sum) {
        Column c = new Column();
        c.name = StringSerializer.get().toByteBuffer("count");
        c.value = IntegerSerializer.get().toByteBuffer(sum);
        c.timestamp = System.currentTimeMillis() * 1000;

        Mutation m = new Mutation();
        m.column_or_supercolumn = new ColumnOrSuperColumn();
        m.column_or_supercolumn.column = c;
        return m;
    }
}
公共静态类ReducerToCassandra扩展了Reducer
{
公共void reduce(文本字、Iterable值、上下文上下文)抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum+=val.get();
}
write(StringSerializer.get().toByteBuffer(word.toString()),Collections.singletonList(getMutation(word,sum));
}
私有静态变异(文本字,整数和){
列c=新列();
c、 name=StringSerializer.get().toByteBuffer(“计数”);
c、 value=IntegerSerializer.get().toByteBuffer(总和);
c、 时间戳=System.currentTimeMillis()*1000;
突变m=新突变();
m、 列或超级列=新列或超级列();
m、 列或超级列。列=c;
返回m;
}
}
而不是这个

c.timestamp=System.currentTimeMillis()*1000

你能试试这个吗

c.setTimestamp(System.currentTimeMillis() * 1000)

你在cassandra中使用哪个API来存储MR作业结果?我想我只是在使用hadoop。我添加了一些代码片段,展示了我是如何配置作业和reducer类的。你觉得这听起来不错吗?实际上,这是一种实现自0.7版本以来升级的时间戳的节俭方法。干杯
public static class ReducerToCassandra extends Reducer<Text, IntWritable, ByteBuffer, List<Mutation>>
{
    public void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(StringSerializer.get().toByteBuffer(word.toString()), Collections.singletonList(getMutation(word, sum)));
    }

    private static Mutation getMutation(Text word, int sum) {
        Column c = new Column();
        c.name = StringSerializer.get().toByteBuffer("count");
        c.value = IntegerSerializer.get().toByteBuffer(sum);
        c.timestamp = System.currentTimeMillis() * 1000;

        Mutation m = new Mutation();
        m.column_or_supercolumn = new ColumnOrSuperColumn();
        m.column_or_supercolumn.column = c;
        return m;
    }
}
c.setTimestamp(System.currentTimeMillis() * 1000)