Dữ liệu đầu vào của tôi ở định dạng hdfs. Tôi chỉ đơn giản là cố gắng để làm wordcount nhưng có sự khác biệt nhỏ. Dữ liệu ở định dạng json. Vì vậy, mỗi dòng dữ liệu là:phân tích cú pháp đầu vào json trong hadoop java
{"author":"foo", "text": "hello"}
{"author":"foo123", "text": "hello world"}
{"author":"foo234", "text": "hello this world"}
Tôi chỉ muốn đếm từ trong phần "văn bản".
Làm cách nào để thực hiện việc này?
Tôi đã thử các biến thể sau đây cho đến nay:
public static class TokenCounterMapper
extends Mapper<Object, Text, Text, IntWritable> {
private static final Log log = LogFactory.getLog(TokenCounterMapper.class);
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
try {
JSONObject jsn = new JSONObject(value.toString());
//StringTokenizer itr = new StringTokenizer(value.toString());
String text = (String) jsn.get("text");
log.info("Logging data");
log.info(text);
StringTokenizer itr = new StringTokenizer(text);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Nhưng tôi nhận được lỗi này:
Error: java.lang.ClassNotFoundException: org.json.JSONException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:820)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:865)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Anh ấy đã đăng mã ngay bây giờ VÀ không trùng lặp, vì vậy đừng downvote mọi thứ như một đứa trẻ năm tuổi. ;) –
Lợn sẽ là một lựa chọn tốt hơn để làm điều đó, IMHO. Và tôi không biết tại sao một số người lại có niềm vui to lớn trong việc bỏ phiếu. Và nếu bạn thực sự muốn làm điều đó, hãy tử tế, đủ để cung cấp một số lý do hợp lý. Đây là lý do mọi người di chuyển đến những nơi khác như Quora. – Tariq