hadoop多输出与cql3

omhiaaxx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(357)

我需要将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吗?

nnsrf1az

nnsrf1az1#

因此,简单的答案是,您不能将mr作业的结果输出到多个cfs。然而,这样做的需要实际上突出了方法中的一个缺陷,而不是hadoop中缺少的特性。
一个更好的方法是迭代地获得所需的结果集,而不是处理一堆记录并试图在一个过程中生成两个不同的结果集。基本上,这意味着有多个作业在前一个作业的结果上迭代,直到达到期望的结果。

相关问题