我需要将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);
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,就像“updatekeyspace1.”一样。?设置值=?“,但我认为不可能像这样为cf使用占位符。
有什么方法可以覆盖reducer类中的outputcql吗?
1条答案
按热度按时间nnsrf1az1#
因此,简单的答案是,您不能将mr作业的结果输出到多个cfs。然而,这样做的需要实际上突出了方法中的一个缺陷,而不是hadoop中缺少的特性。
一个更好的方法是迭代地获得所需的结果集,而不是处理一堆记录并试图在一个过程中生成两个不同的结果集。基本上,这意味着有多个作业在前一个作业的结果上迭代,直到达到期望的结果。