使用 java Mapreduce 处理 JSON

2023-12-30

我是 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);
  }
}

我的任务是在“CombineBooks.java”中创建一个 Hadoop 程序 返回到“question-2”目录中。该程序应该做 以下:给定输入作者书籍元组,map-reduce 程序应该生成一个 JSON 对象,其中包含所有 JSON 数组中同一作者的书籍,即

{"author": "Tobias Wells", "books":[{"book":"A die in the country"},{"book": "Dinky died"}]} 

知道如何做到吗?


首先,您尝试使用的 JSON 对象不可用。为了解决这个问题:

  1. 转到此处并下载 zip 文件:https://github.com/douglascrockford/JSON-java https://github.com/douglascrockford/JSON-java
  2. 解压到子目录 org/json/* 中的源文件夹中

接下来,代码的第一行创建一个包“org.json”,这是不正确的,您应该创建一个单独的包,例如“my.books”。

第三,这里使用combiner是没有用的。

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

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);
    }
}

这是我的项目的文件夹结构:

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"}

您可以使用这三个选项中的一个来放置org.json.*类到您的集群中:

  1. 打包org.json.*类到您的 jar 文件中(可以使用 GUI IDE 轻松完成)。这是我在答案中使用的选项
  2. 将包含的 jar 文件放入org.json.*将每个集群节点上的类放入 CLASSPATH 目录之一(请参阅yarn.application.classpath)
  3. 将包含的 jar 文件放入org.json.*进入HDFS(hdfs dfs -put <org.json jar> <hdfs path>)并使用job.addFileToClassPath要求此 jar 文件可用于在集群上执行作业的所有任务。在我的回答中你应该添加job.addFileToClassPath(new Path("<jar_file_on_hdfs_location>")); to the main
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 java Mapreduce 处理 JSON 的相关文章

随机推荐

  • 掌握递归编程[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在递归方面思考 解决问题时遇到困难 我真的很欣赏这个概念 我可以理解它们 例如创建基本情况 退出情况和递归调用等 我可以解决简单的问题 例如在
  • 在控制器中创建没有区域的子文件夹

    我正在开发一个 MVC 3 Web 应用程序 我想创建这样的东西 Controller Blog BogController cs ViewsController cs ArticlesController cs Customers Sal
  • 如何将环境变量添加到VS解决方案(.sln)

    我需要为解决方案中的所有项目拥有自己的环境变量 例如 VsInstallDir 我如何在我的解决方案中定义它 我正在使用VS2008 C 解决方案 我有一个类似的问题随之而来的问题 https stackoverflow com quest
  • 如何使用 Xcode9 在调试区域显示此日志消息?

    This https stackoverflow com a 25951564 2348597看起来很有希望 但似乎不是一个重复的问题 因为它解决了 Swift 中的问题 我正在完成一个现有的 Objective C 项目 但是NSLog当
  • JavaScript 函数返回给定颜色的“n”个色调(从暗到亮)

    我想获取用于生成标签云的特定颜色的颜色范围 假设用户输入了一些颜色RGB HHHHHH值然后我想写一个函数f color no 返回RGB HHHHHH对于指定 颜色 从深色到浅色的不同色调的 否 这些颜色将有助于显示具有相同色调的不同颜色
  • Python 将字典转换为 CSV

    我正在尝试将字典转换为 CSV 以便它可读 在各自的键中 import csv import json from urllib request import urlopen x 0 id num 848649491 883560475 43
  • 在java中查找RGB的按位版本

    我有以下方法获取 rgb 值并使用较小的调色板对其进行分类 private static int roundToNearestColor int rgb int nrColors int red rgb gt gt 16 0xFF int
  • 代码中未定义的错误

    我的 php 代码有问题 我在这两行中都得到未定义的索引 Page GET Page if GET Page 它只发生在第一页 当然它应该只发生在那时 有人可以告诉我如何解决吗 我发现了类似的东西 但我无法完全删除该通知 empty GET
  • 如何从 Ansible 设置模块的输出中获取列表的第一个元素?

    我从设置模块收到以下数据 ansible nodename 3d734bc2a391 ansible os family RedHat ansible pkg mgr yum ansible processor AuthenticAMD A
  • 检查页面上是否存在Javascript脚本

    我制作了一个书签 它将脚本从我的服务器加载到用户当前页面上 但是 我在脚本中进行了 if 检查 如果不满足条件 则不采取任何操作 但是 如果用户满足该条件 则代码将运行 但会导致将两组脚本插入到其页面中 我可以阻止这个吗 a href Bo
  • 如何在 Winforms Designer 中设置组合框的默认值?

    Locked 有对该问题内容的争议 help locked posts此时正在解决 目前不接受新的答案或互动 我正在使用 Visual Studio 2010 用 C 编写一个 Windows 窗体应用程序 它有一个组合框 我已经设置了Dr
  • 如何在 Gradle 中设置 Kotlin 源编码?

    使用 Gradle 构建 Java 或 Groovy 时 可以像这样定义源编码 compileJava options encoding UTF 8 compileTestJava options encoding UTF 8 compil
  • 如何限制对 Elmah 的远程访问?

    在我们的开发 Web 服务器上安装 Elmah 后 我们可以限制谁远程访问它吗 即使我们对用户名 密码进行硬编码 散列 还是仅通过 IP 有两种设置 一种是在
  • 在构造函数重载的情况下如何调用 super(...) 和 this(...) ?

    我以前从未需要这样做 但由于两者都必须是构造函数中的 第一 行 应该如何处理它 对于这种情况 最好的重构是什么 这是一个示例 public class Agreement extends Postable public Agreement
  • 使 LinearLayout 像 Button 一样工作

    我有一个LinearLayout我设计得看起来像button 它包含一些文本 ImageView 元素 我想做整体LinearLayout表现得像一个button 特别是赋予它在 a 中定义的状态 以便在按下时它具有不同的背景 有没有比制作
  • 浏览器窗口中的所有选项卡是否共享一个 JavaScript 线程?

    一般来说 浏览器中的 JavaScript 执行被认为是单线程的 这个单一线程是否适用于浏览器窗口中打开的所有选项卡 换句话说 如果 不同的 JavaScript 代码在不同的选项卡中运行 它们都是使用单个线程执行的吗 此外 当您打开同一浏
  • 将seaborn图例移动到不同的位置

    我在用着factorplot kind bar 与海博恩 情节很好 只是图例放错了位置 太靠右 文本超出了情节的阴影区域 如何让seaborn将图例放在其他地方 例如左上角而不是右中 基于 user308827的答案 你可以使用legend
  • 我可以在 Facebook 应用程序上设置页面选项卡高度吗?

    我使用以下命令创建了一个 Facebook 页面选项卡应用程序Heroku 托管选项 https devcenter heroku com articles facebook 我看到一个用于将 页面选项卡 宽度设置为 正常 810 像素 或
  • Raphaël 对象:模拟点击

    是否可以模拟拉斐尔对象上的点击 我已经尝试过了 object click Error click is not a function or object dispatchEvent click Error Could not convert
  • 使用 java Mapreduce 处理 JSON

    我是 hadoop mapreduce 新手 我输入了文本文件 其中数据已存储如下 这里只有几个元组 data txt author Shari f Qa sim book al Rabi al manshu d author Na s i