HDFS にいくつかの json データが保存されており、elasticsearch-hadoop map reduce を使用してデータを Elasticsearch に取り込もうとしています。
使用したコードは非常に単純です (以下)。
public class TestOneFileJob extends Configured implements Tool {
public static class Tokenizer extends MapReduceBase
implements Mapper<LongWritable, Text, LongWritable, Text> {
@Override
public void map(LongWritable arg0, Text value, OutputCollector<LongWritable, Text> output,
Reporter reporter) throws IOException {
output.collect(arg0, value);
}
}
@Override
public int run(String[] args) throws Exception {
JobConf job = new JobConf(getConf(), TestOneFileJob.class);
job.setJobName("demo.mapreduce");
job.setInputFormat(TextInputFormat.class);
job.setOutputFormat(EsOutputFormat.class);
job.setMapperClass(Tokenizer.class);
job.setSpeculativeExecution(false);
FileInputFormat.setInputPaths(job, new Path(args[1]));
job.set("es.resource.write", "{index_name}/live_tweets");
job.set("es.nodes", "els-test.css.org");
job.set("es.input.json", "yes");
job.setMapOutputValueClass(Text.class);
JobClient.runJob(job);
return 0;
}
public static void main(String[] args) throws Exception {
System.exit(ToolRunner.run(new TestOneFileJob(), args));
}
}
このコードは正常に機能しましたが、2 つの問題があります。
一番の問題はes.resource.write
資産価値です。現在index_name
、json のプロパティによって提供されます。
json に次のような配列型のプロパティが含まれている場合
{
"tags" : [{"tag" : "tag1"}, {"tag" : "tag2"}]
}
たとえばes.resource.write
、最初の値を取得するように構成するにはどうすればよいでしょうか?tag
使用しようとしまし{tags.tag}
た{tags[0].tag}
が、どちらも機能しませんでした。
もう 1 つの問題は、tags プロパティの 2 つの値でジョブに json ドキュメントのインデックスを作成するにはどうすればよいですか?