1

我正在使用 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)
);

我的输出查询是: UPDATE 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

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

知道如何解决这个问题吗?

4

1 回答 1

0

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

根据之前的发布时间表,我预计 1.2.10 将在 2013 年 9 月末推出。这个问题似乎在 Cassandra 2.0 中不存在。

于 2013-09-16T17:49:57.647 回答