MR ジョブの結果を複数の CQL3 列ファミリーに出力する必要があります。
私のレデューサーでは、MultipleOutputs を使用して CF を指定しますが、すべての結果は、ジョブの OutputCQL ステートメントで定義された 1 つの 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 メソッド (疑似コード):
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 に書き込まれます。
「UPDATE keyspace1.? SET value = ?」の行に沿って、準備済みステートメントを使用してCFをoutputCQLに挿入しようとしましたが、このようにCFにプレースホルダーを使用することは可能だとは思いません。
レデューサー クラス内で outputCQL を上書きする方法はありますか?