如何在Hadoop的MapReduce程序中处理JSON文件
简介:
最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑。但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包。这里选择json-simple实现我们的功能。
在Hadoop上执行Java程序的命令如下所示:
[hadoop@localhost]$ hadoop jar my-mapreduce.jar
my-mapreduce.jar是我们进行日志处理的MapReduce程序。现在假定我们需要在其中处理JSON格式的配置文件,这里忽略如何在Hadoop集群读取文件的细节,只关注如何使用JSON工具包。下面是简单的HelloWorld程序:
import org.json.simple.JSONObject;
public class HelloWorld{
public static void main(String[] args){
JSONObject obj=new JSONObject();
obj.put("name","foo");
obj.put("num",new Integer(100));
obj.put("balance",new Double(1000.21));
obj.put("is_vip",new Boolean(true));
obj.put("nickname",null);
System.out.print(obj);
}
}
在HelloWorld程序中,只简单修改JSON对象,将其内容打印输出,从而验证解析修改JSON内容的过程。
编译:
由于MapReduce程序需提交到Hadoop集群执行,所以HelloWorld依赖的json-simple包必须存在于集群的classpath路径中,如果集群上没有对应的jar包。执行HelloWorld会出现如下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/JSONObject
简单的解决方法是将json-simple包直接和HelloWorld编译结果一起打包,然后即可使用命令hadoop jar HelloWorld.jar执行。需将json-simple的jar包解压再同HelloWorld打包。
编译命令如下所示:
[hadoop@localhost]$ jar tf json-simple-1.1.1.jar
META-INF/MANIFEST.MF
META-INF/
META-INF/maven/
META-INF/maven/com.googlecode.json-simple/
META-INF/maven/com.googlecode.json-simple/json-simple/
META-INF/maven/com.googlecode.json-simple/json-simple/pom.properties
META-INF/maven/com.googlecode.json-simple/json-simple/pom.xml
org/
org/json/
org/json/simple/
org/json/simple/ItemList.class
org/json/simple/JSONArray.class
org/json/simple/JSONAware.class
org/json/simple/JSONObject.class
org/json/simple/JSONStreamAware.class
org/json/simple/JSONValue.class
org/json/simple/parser/
org/json/simple/parser/ContainerFactory.class
org/json/simple/parser/ContentHandler.class
org/json/simple/parser/JSONParser.class
org/json/simple/parser/ParseException.class
org/json/simple/parser/Yylex.class
org/json/simple/parser/Yytoken.class [hadoop@localhost]$ unzip json-simple-1.1.1.jar
[hadoop@localhost]$ javac -classpath ./json-simple-1.1.1.jar HelloWorld.java
[hadoop@localhost]$ jar -cfe HelloWorld.jar HelloWorld HelloWorld.class ./org/
执行HelloWorld
[hadoop@localhost]$ hadoop jar HelloWorld.jar
{"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}
如何在Hadoop的MapReduce程序中处理JSON文件的更多相关文章
- 如何在Windows下面运行hadoop的MapReduce程序
在Windows下面运行hadoop的MapReduce程序的方法: 1.下载hadoop的安装包,这里使用的是"hadoop-2.6.4.tar.gz": 2.将安装包直接解压到 ...
- hadoop-初学者写map-reduce程序中容易出现的问题 3
1.写hadoop的map-reduce程序之前所必须知道的基础知识: 1)hadoop map-reduce的自带的数据类型: Hadoop提供了如下内容的数据类型,这些数据类型都实现了Writab ...
- 用PHP编写Hadoop的MapReduce程序
用PHP编写Hadoop的MapReduce程序 Hadoop流 虽然Hadoop是用Java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编 ...
- Hadoop之MapReduce程序应用三
摘要:MapReduce程序进行数据去重. 关键词:MapReduce 数据去重 数据源:人工构造日志数据集log-file1.txt和log-file2.txt. log-file1.txt内容 ...
- 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS
如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...
- WinForm程序中两份mdf文件问题的解决
在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给 ...
- 程序中的.htaccess文件是做什么的
程序中的.htaccess文件是做什么的 一.总结 一句话总结: htaccess=ht(Hypertext)+access=超文本入口 覆盖Apache服务器的默认配置 .htaccess(超文本访 ...
- Expo大作战(五)--expo中app.json 文件的配置信息
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- HADOOP之MAPREDUCE程序应用二
摘要:MapReduce程序进行单词计数. 关键词:MapReduce程序 单词计数 数据源:人工构造英文文档file1.txt,file2.txt. file1.txt 内容 Hello Ha ...
随机推荐
- 基于Spark ALS构建商品推荐引擎
基于Spark ALS构建商品推荐引擎 一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速.更准确的获得所需 ...
- hibernate对象关系实现(一)一对多
hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...
- Java的加密与解密
package com.wangbo.util; import java.security.Key; import java.security.Security; import javax.crypt ...
- iOS开发之 Xcode 5 下让你的应用在不同状态(debug, release)有不同的图标
http://nickcheng.com/post/unique-icons-for-your-app-in-different-state-in-xcode5-debug-release 应用在发布 ...
- Sqlserver_时间用法
函数 描述 GETDATE() 返回当前的日期和时间 DATEPART() 返回日期/时间的单独部分 DATEADD() 在日期中添加或减去指定的时间间隔 DATEDIFF() 返回两个日期之间的时间 ...
- SqlServer_事务
事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下:方法1:直接写入到sql 中在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRA ...
- Windows 内存架构
理解 Virtual Memory, Physical Memory, Committed Memory, Page File, Working Set, Modified Pages, Standb ...
- java的IO流
java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...
- parent relation column can't be updated LESSON_EXTENDED_ATTRIBUTE->LESSON_ID
MyCat 中 作为分片的主键不允许更新 , 需要设置为null,调用updateSelectiveByPrimaryKey来更新数据 parent relation column can't be ...
- VC++源文件编码
目录 第1章源代码文件 1 1.1 研究思路 1 1.2 实验结果 3 1.3 #pragma setlocale 4 1.4 /source-charset 5 1.5 ...