Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaMapReduce处理JSON_Json_Hadoop_Mapreduce - Fatal编程技术网

使用JavaMapReduce处理JSON

使用JavaMapReduce处理JSON,json,hadoop,mapreduce,Json,Hadoop,Mapreduce,我是hadoop mapreduce的新手 我输入了文本文件,其中数据存储如下。这里只有几个元组(data.txt) 这是我应该用来编写代码的java文件(CombineBooks.java) 知道怎么做吗?首先,您尝试使用的JSON对象不适用于您。要解决这个问题: 转到此处并以zip格式下载: 解压缩到子目录org/json中的sources文件夹/* 接下来,代码的第一行生成一个包“org.json”,这是不正确的,您应该创建一个单独的包,例如“my.books” 第三,在这里使用组合器是无

我是hadoop mapreduce的新手

我输入了文本文件,其中数据存储如下。这里只有几个元组(data.txt)

这是我应该用来编写代码的java文件(CombineBooks.java)


知道怎么做吗?

首先,您尝试使用的JSON对象不适用于您。要解决这个问题:

  • 转到此处并以zip格式下载:
  • 解压缩到子目录org/json中的sources文件夹/*
  • 接下来,代码的第一行生成一个包“org.json”,这是不正确的,您应该创建一个单独的包,例如“my.books”

    第三,在这里使用组合器是无用的

    以下是我最终得到的代码,它可以工作并解决您的问题:

    package my.books;
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
    import org.json.*;
    
    import javax.security.auth.callback.TextInputCallback;
    
    public class CombineBooks {
    
        public static class Map extends Mapper<LongWritable, Text, Text, Text>{
    
            public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
    
                String author;
                String book;
                String line = value.toString();
                String[] tuple = line.split("\\n");
                try{
                    for(int i=0;i<tuple.length; i++){
                        JSONObject obj = new JSONObject(tuple[i]);
                        author = obj.getString("author");
                        book = obj.getString("book");
                        context.write(new Text(author), new Text(book));
                    }
                }catch(JSONException e){
                    e.printStackTrace();
                }
            }
        }
    
        public static class Reduce extends Reducer<Text,Text,NullWritable,Text>{
    
            public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
    
                try{
                    JSONObject obj = new JSONObject();
                    JSONArray ja = new JSONArray();
                    for(Text val : values){
                        JSONObject jo = new JSONObject().put("book", val.toString());
                        ja.put(jo);
                    }
                    obj.put("books", ja);
                    obj.put("author", key.toString());
                    context.write(NullWritable.get(), new Text(obj.toString()));
                }catch(JSONException e){
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            if (args.length != 2) {
                System.err.println("Usage: CombineBooks <in> <out>");
                System.exit(2);
            }
    
            Job job = new Job(conf, "CombineBooks");
            job.setJarByClass(CombineBooks.class);
            job.setMapperClass(Map.class);
            job.setReducerClass(Reduce.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(Text.class);
            job.setOutputKeyClass(NullWritable.class);
            job.setOutputValueClass(Text.class);
            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
    
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    
    这是输入

    [localhost:CombineBooks]$ hdfs dfs -cat /example.txt
    {"author":"author1", "book":"book1"}
    {"author":"author1", "book":"book2"}
    {"author":"author1", "book":"book3"}
    {"author":"author2", "book":"book4"}
    {"author":"author2", "book":"book5"}
    {"author":"author3", "book":"book6"}
    
    要运行的命令:

    hadoop jar ./bookparse.jar my.books.CombineBooks /example.txt /test_output
    
    以下是输出:

    [pivhdsne:CombineBooks]$ hdfs dfs -cat /test_output/part-r-00000
    {"books":[{"book":"book3"},{"book":"book2"},{"book":"book1"}],"author":"author1"}
    {"books":[{"book":"book5"},{"book":"book4"}],"author":"author2"}
    {"books":[{"book":"book6"}],"author":"author3"}
    
    您可以使用三个选项中的一个将
    org.json.*
    类放入集群:

  • org.json.*
    类打包到jar文件中(可以使用GUI IDE轻松完成)。这是我在回答中使用的选项
  • 将每个集群节点上包含
    org.json.*
    类的jar文件放入一个类路径目录中(请参阅warn.application.CLASSPATH)
  • 将包含
    org.json.*
    的jar文件放入HDFS(
    HDFS-Put
    )中,并使用
    job.addFileToClassPath
    调用使此jar文件可用于集群上执行作业的所有任务。在我的回答中,您应该添加
    job.addFileToClassPath(新路径(“”)
    主程序

  • 请参阅可拆分多行JSON:

    +1如果没有
    作业。addFileToClassPath
    语句,此解决方案是不完整的。请加上,视情况而定。您可以将
    org.json
    内容构建为一个单独的jar文件,并手动将其放置在
    CLASSPATH
    目录中的每个集群节点上(这是首选解决方案,因为json解析是一项常见任务)。或者您可以将
    org.json
    my.books
    放在一个jar中,这样您就不必使用
    job.addFileToClassPath
    。或者,您可以将其构建为一个单独的jar文件,并使用
    job.addFileToClassPath
    在执行时将其发送到集群节点。您必须根据任务的上下文选择一个选项,对于生产,我更喜欢1,对于开发和调试-2或3在答案中添加相同的行将使任何寻找此帖子的人受益。如果没有这些知识,他们将进入另一个异常,如果以前没有遇到过的话。这是我的意图。添加到solution@0x0FFF.. 这真是太棒了,你能告诉我如何在Ubuntu终端中生成JAR文件吗,请帮助我,,,这是我发布的问题,使用ApacheDrill和SQL怎么样?
    src
    src/my
    src/my/books
    src/my/books/CombineBooks.java
    src/org
    src/org/json
    src/org/json/zip
    src/org/json/zip/BitReader.java
    ...
    src/org/json/zip/None.java
    src/org/json/JSONStringer.java
    src/org/json/JSONML.java
    ...
    src/org/json/JSONException.java
    
    [localhost:CombineBooks]$ hdfs dfs -cat /example.txt
    {"author":"author1", "book":"book1"}
    {"author":"author1", "book":"book2"}
    {"author":"author1", "book":"book3"}
    {"author":"author2", "book":"book4"}
    {"author":"author2", "book":"book5"}
    {"author":"author3", "book":"book6"}
    
    hadoop jar ./bookparse.jar my.books.CombineBooks /example.txt /test_output
    
    [pivhdsne:CombineBooks]$ hdfs dfs -cat /test_output/part-r-00000
    {"books":[{"book":"book3"},{"book":"book2"},{"book":"book1"}],"author":"author1"}
    {"books":[{"book":"book5"},{"book":"book4"}],"author":"author2"}
    {"books":[{"book":"book6"}],"author":"author3"}