使用CQL3的Hadoop多输出

使用CQL3的Hadoop多输出,hadoop,mapreduce,cassandra,cql3,Hadoop,Mapreduce,Cassandra,Cql3,我需要将MR作业的结果输出到多个CQL3列族 在我的reducer中,我使用multipleOutput指定CF,但所有结果都写入作业的OutputCQL语句中定义的一个CF 工作定义: ... job.setOutputFormatClass(CqlOutputFormat.class); ConfigHelper.setOutputKeyspace(job.getConfiguration(), "keyspace1"); MultipleOutputs.addNamedOutput(job

我需要将MR作业的结果输出到多个CQL3列族

在我的reducer中,我使用multipleOutput指定CF,但所有结果都写入作业的OutputCQL语句中定义的一个CF

工作定义:

...
job.setOutputFormatClass(CqlOutputFormat.class);
ConfigHelper.setOutputKeyspace(job.getConfiguration(), "keyspace1");
MultipleOutputs.addNamedOutput(job, "CF1", CqlOutputFormat.class, Map.class, List.class);
MultipleOutputs.addNamedOutput(job, "CF2", CqlOutputFormat.class, Map.class, List.class);
CqlConfigHelper.setOutputCql(job.getConfiguration(), "UPDATE keyspace1.CF1 SET value = ? ");
...
减速器等级设置:

mos = new MultipleOutputs(context);
减少方法(psudo代码):

keys=newlinkedhashmap();
keys.put(“key”,ByteBufferUtil.bytes(“rowKey”);
keys.put(“name”,ByteBufferUtil.bytes(“columnName”);
列表变量=新的ArrayList();
add(ByteBufferUtil.bytes(“columnValue”);
mos.写入(“CF2”、键、变量);
问题是我的reducer忽略了我在mos.write()中指定的CF,而必须只运行outputCQL。因此,在上面的示例中,所有内容都写入CF1

我试着使用一条准备好的语句将CF注入outputCQL,就像“UPDATE keyspace1。?SET value=?”一样,但我认为不可能像这样为CF使用占位符


有什么方法可以覆盖reducer类中的outputCQL吗?

因此简单的答案是,您不能将mr作业的结果输出到多个CFs。然而,需要这样做实际上突出了该方法中的一个缺陷,而不是Hadoop中缺少的一个特性

与处理一堆记录并尝试在一次过程中生成两个不同的结果集不同,更好的方法是迭代获得所需的结果集。基本上,这意味着有多个作业在以前作业的结果上迭代,直到达到所需的结果

keys = new LinkedHashMap<>();
keys.put("key", ByteBufferUtil.bytes("rowKey"));
keys.put("name", ByteBufferUtil.bytes("columnName"));

List<ByteBuffer> variables = new ArrayList<>();
variables.add(ByteBufferUtil.bytes("columnValue"));

mos.write("CF2", keys, variables);