Hadoop从HDFS读取JSON

Hadoop从HDFS读取JSON,json,hadoop,mapreduce,reader,Json,Hadoop,Mapreduce,Reader,我正在尝试将JSON文件读入hadoop mapreduce算法。 我该怎么做?我已将文件“testinput.json”放入HDFS内存中的/input中 调用mapreduce时,我执行hadoop jar popularityMR2.jar populariy input output,输入说明dhfs内存中的输入目录 public static class PopularityMapper extends Mapper<Object, Text, Text, Text>{

我正在尝试将JSON文件读入hadoop mapreduce算法。 我该怎么做?我已将文件“testinput.json”放入HDFS内存中的/input中

调用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();
        }
    }

}
public静态类PopularityMapper扩展映射器{
受保护的空映射(对象键、文本值、,
上下文(上下文)
抛出IOException、InterruptedException{
JSONParser JSONParser=新的JSONParser();
试一试{
JSONObject JSONObject=(JSONObject)jsonParser.parse(新文件读取器(“hdfs://input/testinput.json"));
JSONArray JSONArray=(JSONArray)jsonobject.get(“投票”);
迭代器迭代器=jsonArray.Iterator();
while(iterator.hasNext()){
JSONObject obj=iterator.next();
字符串song_id_rave_id=(String)obj.get(“song_id”)+,“+(String)obj.get(“rave_id”)+”,”;
字符串首选项=(字符串)obj.get(“首选项”);
System.out.println(song_id_rave_id+“||”+首选项);
编写(新文本(song_id_rave_id),新文本(首选项));
}
}捕获(解析异常){
e、 printStackTrace();
}
}
}
我的映射器函数现在看起来像这样。我从dhfs内存中读取文件。但它总是返回一个错误,即找不到文件

有人知道我如何将这个json读入jsonobject吗

谢谢

  • FileReader
    无法从HDFS读取,只能从本地文件系统读取

  • 文件路径来自作业参数-
    FileInputFormat.addInputPath(作业,新路径(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);
    

    尝试使用pydoop库使用以下函数从HDFS路径中读取JSON,并且工作正常。希望有帮助

    import pydoop.hdfs as hdfs
    
    def lreadline(inputJsonIterator):
        with hdfs.open(inputJsonIterator,mode='rt') as f:
            lines = f.read().split('\n')
        return lines
    

    或者我需要在这里使用InputstreamReader吗?如果是,怎么做?