Hadoop从HDFS读取JSON
我正在尝试将JSON文件读入hadoop mapreduce算法。 我该怎么做?我已将文件“testinput.json”放入HDFS内存中的/input中 调用mapreduce时,我执行hadoop jar popularityMR2.jar populariy input output,输入说明dhfs内存中的输入目录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>{
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])代码>
{"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吗?如果是,怎么做?