Hadoop читает JSON из HDFS - PullRequest
       21

Hadoop читает JSON из HDFS

0 голосов
/ 25 октября 2019

Я пытаюсь прочитать JSON-файл в мой алгоритм map-reduce hadoop. Как я могу это сделать? Я поместил файл 'testinput.json' в / input в моей памяти HDFS.

При вызове mapreduce я выполняю hadoop jar popularityMR2.jar populariy input output, с вводом с указанием каталога ввода в памяти dhfs.

public static class PopularityMapper extends Mapper<Object, Text, Text, Text>{


    protected void map(Object key, Text value,
                       Context context)
            throws IOException, InterruptedException {

        JSONParser jsonParser = new JSONParser();
        try {
            JSONObject jsonobject = (JSONObject) jsonParser.parse(new FileReader("hdfs://input/testinput.json"));
            JSONArray jsonArray = (JSONArray) jsonobject.get("votes");

            Iterator<JSONObject> iterator = jsonArray.iterator();
            while(iterator.hasNext()) {
                JSONObject obj = iterator.next();
                String song_id_rave_id = (String) obj.get("song_ID") + "," + (String) obj.get("rave_ID")+ ",";
                String preference = (String) obj.get("preference");
                System.out.println(song_id_rave_id + "||" + preference);
                context.write(new Text(song_id_rave_id), new Text(preference));
            }
        }catch(ParseException e) {
            e.printStackTrace();
        }
    }

}

Моя функция отображения теперь выглядит следующим образом. Я прочитал файл из памяти dhfs. Но всегда возвращает ошибку, файл не найден.

Кто-нибудь знает, как я могу прочитать этот json в jsonobject?

Спасибо

1 Ответ

0 голосов
/ 25 октября 2019
  1. FileReader не может читать из HDFS, только локальная файловая система.

  2. Путь к файлу определяется параметрами задания - FileInputFormat.addInputPath(job, new Path(args[0]));

В любом случае, вы не прочтете файл в классе Mapper.

По умолчанию MapReduce считывает файлы с разделителями строк, поэтому ваши JSON-объекты должны быть по одному на строку, например

{"votes":[]}
{"votes":[]}

. Из преобразователя вы будете анализировать текстовые объекты в JSONObject. вот так

 protected void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {

    JSONParser jsonParser = new JSONParser();
    try {
        JSONObject jsonobject = (JSONObject) jsonParser.parse(value.toString());
        JSONArray jsonArray = (JSONArray) jsonobject.get("votes");

Если в файле только один объект JSON, то, вероятно, вам не следует использовать MapReduce.


В противном случае вам придется реализовать WholeFileInputFormat и установить его в задании

job.setInputFormatClass(WholeFileInputFormat.class);
...