我需要将MR作业的结果输出到多个CQL3列族。
在我的reducer中,我使用MultipleOutputs指定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 = ? ");
...
Reducer类设置:
mos = new MultipleOutputs(context);
Reduce方法(psudo代码):
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);
问题是我的reducer忽略了我在mos.write()中指定的CF,而只是运行outputCQL。所以在上面的例子中,所有内容都写入CF1。
我尝试使用预准备语句将CF注入outputCQL,沿着“UPDATE keyspace1。?SET value =?”,但我不认为可以像这样使用CF的占位符。
有没有办法可以覆盖reducer类中的outputCQL?
答案 0 :(得分:0)
所以简单的答案是你不能将mr作业的结果输出到多个CF.但是,有必要这样做实际上突出了方法中的一个缺陷,而不是Hadoop中缺少的功能。
不是处理一堆记录并尝试在一次传递中产生2个不同的结果集,而是更好的方法是迭代地得到所需的结果集。基本上,这意味着有多个工作迭代以前的工作结果,直到达到预期的结果。