我正在使用 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 字符串。
知道如何解决这个问题吗?
最佳答案
这是 1.2.10 之前的 Cassandra 中的一个已知问题:https://issues.apache.org/jira/browse/CASSANDRA-5949
根据之前的发布时间表,我预计 1.2.10 将在 2013 年 9 月底左右推出。这个问题在 Cassandra 2.0 中似乎不存在。
关于hadoop - Cassandra CQL3 复合 key 不是由 Hadoop reducer 编写的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18566882/