我是hadoop mapreduce的新手
我输入的文本文件中的数据已存储如下。这里只有几个元组(data.txt)
{"author":"Sharīf Qāsim","book":"al- Rabīʻ al-manshūd"}
{"author":"Nāṣir Nimrī","book":"Adīb ʻAbbāsī"}
{"author":"Muẓaffar ʻAbd al-Majīd Kammūnah","book":"Asmāʼ Allāh al-ḥusná al-wāridah fī muḥkam kitābih"}
{"author":"Ḥasan Muṣṭafá Aḥmad","book":"al- Jabhah al-sharqīyah wa-maʻārikuhā fī ḥarb Ramaḍān"}
{"author":"Rafīqah Salīm Ḥammūd","book":"Taʻlīm fī al-Baḥrayn"}
这是我应该用来编写代码的java文件(combinebooks.java)
package org.hwone;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.GenericOptionsParser;
//TODO import necessary components
/*
* Modify this file to combine books from the same other into
* single JSON object.
* i.e. {"author": "Tobias Wells", "books": [{"book":"A die in the country"},{"book": "Dinky died"}]}
* Beaware that, this may work on anynumber of nodes!
*
* /
public class CombineBooks {
//TODO define variables and implement necessary components
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: CombineBooks <in> <out>");
System.exit(2);
}
//TODO implement CombineBooks
Job job = new Job(conf, "CombineBooks");
//TODO implement CombineBooks
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
我的任务是在“question-2”目录中返回的“combinebooks.java”中创建一个hadoop程序。程序应该执行以下操作:给定输入的author book元组,map-reduce程序应该生成一个json对象,该对象在一个json数组中包含来自同一作者的所有书籍,即。
{"author": "Tobias Wells", "books":[{"book":"A die in the country"},{"book": "Dinky died"}]}
你知道怎么做吗?
2条答案
按热度按时间wfveoks01#
首先,您尝试使用的json对象对您不可用。要解决此问题:
转到此处并以zip格式下载:https://github.com/douglascrockford/json-java
提取到子目录org/json中的sources文件夹/*
接下来,代码的第一行生成一个包“org.json”,这是不正确的,您应该创建一个单独的包,例如“my.books”。
第三,在这里使用合路器是无用的。
以下是我最终得到的代码,它可以工作并解决您的问题:
以下是我的项目的文件夹结构:
这是输入
要运行的命令:
输出如下:
您可以使用三个选项中的一个
org.json.*
群集中的类:打包
org.json.*
类放入jar文件中(可以使用gui ide轻松完成)。这是我在回答中使用的选项将包含
org.json.*
将每个集群节点上的类放入一个类路径目录中(参见yarn.application.classpath)将包含
org.json.*
进入hdfs(hdfs dfs -put <org.json jar> <hdfs path>
)使用job.addFileToClassPath
调用此jar文件,使其可用于集群上执行作业的所有任务。在我的回答中你应该加上job.addFileToClassPath(new Path("<jar_file_on_hdfs_location>"));
到main
zz2j4svz2#
请参阅可拆分多行json:https://github.com/alexholmes/json-mapreduce