我正在使用Cassandra 1.2.8,并且有几个Hadoop MapReduce作业,它们从某些CQL3表中读取行并将结果写回到另一个CQL3表中。

如果输出的CQL3表包含复合键,则复合键字段的值不会由reducer写入-而是在cqlsh中执行选择查询时,我看到这些字段的空值。如果主键不是复合键,则一切正常。

带有复合键的输出CQL3表示例:

CREATE TABLE events_by_type_with_source (
    event_type_id ASCII,
    period ASCII,
    date TIMESTAMP,
    source_name ASCII,
    events_number COUNTER,
    PRIMARY KEY((event_type_id, period), date, source_name)
);

我的输出查询是:
更新events_by_type_with_source SET events_number = events_number +?

我的Reducer函数如下所示:
public void reduce(BytesWritable key, Iterable<BytesWritable> values, Context context) {
     ...
    private final Map<String, ByteBuffer> keys = new HashMap<>();
    ...
    keys.put(COLUMN_EVENT_TYPE_ID, eventTypeIdByteBuffer);
    keys.put(COLUMN_SOURCE_NAME, sourceNameByteBuffer);
    keys.put(COLUMN_DATE, dateByteBuffer);
    keys.put(COLUMN_PERIOD, periodByteBuffer);
    ...
    context.write(keys, Arrays.asList(countByteBuffer));

}

结果是:
cqlsh:keyspace1> select * from dd_events_by_type_with_source ;

 event_type_id | period | date                     | source_name | events_number
---------------+--------+--------------------------+-------------+---------------
               |        | 2013-08-01 00:00:00+0000 |           A |            24
               |        | 2013-08-26 00:00:00+0000 |           A |            24
               |        | 2013-08-27 00:00:00+0000 |           A |            24
               |        | 2013-08-27 08:00:00+0000 |           A |            24

如您所见,即使我在reducer中放入了非空的有效ASCII字符串,event_type_id和period字段也为空。

任何想法如何解决这个问题?

最佳答案

这是1.2.10之前的Cassandra中的一个已知问题:https://issues.apache.org/jira/browse/CASSANDRA-5949

根据以前的发布时间表,我希望1.2.10在2013年9月下旬可用。在Cassandra 2.0中似乎不存在此问题。

关于hadoop - 不是由Hadoop Reducer编写的Cassandra CQL3复合 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18566882/

10-16 17:37