我需要将 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 = ? ");
...
减速器类设置:
mos = new MultipleOutputs(context);
减少方法(伪代码):
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);
问题是我的减速器忽略了我在 mos.write() 中指定的 CF,而必须只运行 outputCQL。所以在上面的例子中,所有内容都写入 CF1。
我尝试使用准备好的语句将 CF 注入到 outputCQL 中,按照“UPDATE keyspace1.?SET value = ?”的行,但我认为不可能像这样为 CF 使用占位符。
有什么办法可以覆盖减速器类中的 outputCQL 吗?