使用MapReduce读取XML文件

Similar documents
三种方法实现Hadoop(MapReduce)全局排序(1)

Hadoop&Spark解决二次排序问题(Hadoop篇)

新・解きながら学ぶJava

使用Cassandra和Spark 2.0实现Rest API服务

Spark读取Hbase中的数据

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

通过Hive将数据写入到ElasticSearch

Guava学习之Resources

在Spring中使用Kafka:Producer篇

三种方法实现Hadoop(MapReduce)全局排序(2)

使用Hive读取ElasticSearch中的数据

Hive:用Java代码通过JDBC连接Hiveserver

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö

Flume-ng与Mysql整合开发

JavaIO.PDF

使用Spark SQL读取Hive上的数据

关于天云趋势 天云趋势由宽带资本和趋势科技共同投资成立于 2010 年 3 月 趋势科技是 Hadoop 的重度使用者 : 2006 年开始使用, 用于处理网页和邮件服务器评级 五个数据中心, 近 1000 个节点, 最大集群约 500 台服务器 日均处理 3.6T 日志数据 亚洲最早, 也是最大的

Hadoop 集 群 ( 第 6 期 ) WordCount 运 行 详 解 1 MapReduce 理 论 简 介 1.1 MapReduce 编 程 模 型 MapReduce 采 用 分 而 治 之 的 思 想, 把 对 大 规 模 数 据 集 的 操 作, 分 发 给 一 个 主 节 点 管

Hadoop元数据合并异常及解决方法

如何在 Apache Hive 中解析 Json 数组

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Guava学习之CharSequenceReader

Microsoft Word - 01.DOC

Apache CarbonData集群模式使用指南

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

《大话设计模式》第一章

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:


chp6.ppt

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

untitled

untitled

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

韶关:神奇丹霞

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

EJB-Programming-4-cn.doc

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

哼, 你 們 不 回 答 又 怎 麼 樣? 不 管 是 多 大 來 頭, 現 在 都 被 血 魔 吞 噬 無 蹤 了 你 們 幾 個 真 是 太 過 分, 我 不 犯 你 們, 你 們 卻 一 天 到 晚 來 挑 釁 我 教 尊 冷 笑 著 說 道 嗚, 大 人 土 地 大 姐 跪 下 來, 流 下

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Chapter 9: Objects and Classes

Flink快速上手(QuickStart)

伊春:醉人林都

Java

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

untitled

MapReduce

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Chapter 9: Objects and Classes

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

关林:武圣陵寝

泰山:五岳独尊

国内26省市新能源汽车推广规划已出台

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

Microsoft PowerPoint - hbase_program(0201).ppt

java2d-4.PDF

北戴河:海阔天空

Kafka客户端是如何找到 leader 分区的

软件工程文档编制

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

HBase 中加盐(Salting)之后的表如何读取:协处理器篇

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

目录 1 本期内容 MapReduce 理论简介 MapReduce 编程模型 MapReduce 处理过程 运行 WordCount 程序 准备工作 运行例子

投影片 1

「西醫基層總額支付委員會《第28次委員會議紀錄

7521,WARD,SALESMAN,7698,22-2 月 -81,1250,500, ,JONES,MANAGER,7839,02-4 月 -81,2975,, ,MARTIN,SALESMAN,7698,28-9 月 -81,1250,1400, ,BLAK

在Fedora上部署Hadoop2.2.0伪分布式平台

全国计算机技术与软件专业技术资格(水平)考试

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课


西岭雪山滑雪场

SparkR(R on Spark)编程指南

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

untitled

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

javaexample-02.pdf

Swing-02.pdf

EJB-Programming-3.PDF

國家圖書館典藏電子全文

IoC容器和Dependency Injection模式.doc

1. 访 问 最 新 发 行 公 告 信 息 jconnect for JDBC 访 问 最 新 发 行 公 告 信 息 最 新 版 本 的 发 行 公 告 可 以 从 网 上 获 得 若 要 查 找 在 本 产 品 发 布 后 增 加 的 重 要 产 品 或 文 档 信 息, 请 访

Learning Java

Microsoft Word - ch04三校.doc

untitled

输入 project name 选择完成

Spark 2.0介绍:在Spark SQL中定义查询优化规则

新版 明解C++入門編

编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

江门:中国第一侨乡

untitled

是 喔, 就 是 那 個 在 BBS 醫 療 版 跟 你 嗆 聲, 自 稱 有 三 十 多 年 推 拿 經 驗 的 大 叔 嗎? 一 個 看 來 頗 為 清 秀 的 女 生 問 道, 她 語 氣 中 略 感 訝 異 是 啊, 什 麼 推 拿 按 摩 有 多 好, 還 要 人 生 病 盡 量 不 要

Microsoft Word doc

Transcription:

使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop 内部是无法直接解析 XML 文件 ; 而且 XML 格式中没有同步标记, 所以并行地处理单个 XML 文件比较棘手 本文将一一介绍如何使用 MapReduce 处理 XML 文件, 并且能够对其进行分割, 然后并行处理这些分片 MapReduce 里面读取文件一般都是使用 InputFormat 类进行的, 比如读取文本文件可以使用 TextInputFormat 类进行 ( 关于 InputFormat 类的源码分析可以参见 MapReduce 数据输入中 InputFormat 类源码解析 ), 所以我们在 MapReduce 中解析 XML 文件也可以自定义类似的 XMLInputFormat 熟悉 Mahout 的同学应该知道, 它里面实现了一个 XmlInputFormat(https://github.com/apache/mahout/blo b/ad84344e4055b1e6adff5779339a33fa29e1265d/examples/src/main/java/org/apache/maho ut/classifier/bayes/xmlinputformat.java) 类, 我们可以指定指定的开始和结束标记来分隔 XML 文件, 然后我们就可以像解析 Text 文件一样来解析 Xml 文件, 如下 : Configuration conf = new Configuration(); conf.set("xmlinput.start", "<property>"); conf.set("xmlinput.end", "</property>"); Job job = new Job(conf); job.setinputformatclass(xmlinputformat.class); 指定了 xmlinput.start 和 xmlinput.end 就可以搜索 XML 文件中的开始和结束标记, 从而获取到 XML 里面的数据 完整的 map 程序如下 : import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.*; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.*; import org.slf4j.*; import javax.xml.stream.*; import java.io.*; 1 / 5

public static class Map extends Mapper<LongWritable, Text, Text, Text> { @Override protected void map(longwritable key, Text value, Mapper.Context context) throws IOException, InterruptedException { String document = value.tostring(); System.out.println("'" + document + "'"); try { XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(document.getBytes())); String propertyname = ""; String propertyvalue = ""; String currentelement = ""; while (reader.hasnext()) { int code = reader.next(); switch (code) { case START_ELEMENT: currentelement = reader.getlocalname(); case CHARACTERS: if (currentelement.equalsignorecase("name")) { propertyname += reader.gettext(); else if (currentelement.equalsignorecase("value")) { propertyvalue += reader.gettext(); reader.close(); context.write(propertyname.trim(), propertyvalue.trim()); catch (Exception e) { log.error("error processing '" + document + "'", e); map 接收一个 Text 的值, 里面的值包含了开始和结束的标记之间的数据, 然后我们就可以使用 jav a 内置的 XML Streaming API 解析器提取每个属性的 key 和 value, 最后输出 key 和 value 完整的代码如下 : package com.iteblog.hadoop; 2 / 5

import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.*; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.*; import org.slf4j.*; import javax.xml.stream.*; import java.io.*; import static javax.xml.stream.xmlstreamconstants.*; public final class XML{ private static final Logger log = LoggerFactory.getLogger (HadoopPropertyXMLMapReduce.class); public static class Map extends Mapper<LongWritable, Text, Text, Text> { @Override protected void map(longwritable key, Text value, Mapper.Context context) throws IOException, InterruptedException { String document = value.tostring(); System.out.println("'" + document + "'"); try { XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(document.getBytes())); String propertyname = ""; String propertyvalue = ""; String currentelement = ""; while (reader.hasnext()) { int code = reader.next(); switch (code) { case START_ELEMENT: currentelement = reader.getlocalname(); case CHARACTERS: if (currentelement.equalsignorecase("name")) { propertyname += reader.gettext(); else if (currentelement.equalsignorecase("value")) { propertyvalue += reader.gettext(); 3 / 5

reader.close(); context.write(propertyname.trim(), propertyvalue.trim()); catch (Exception e) { log.error("error processing '" + document + "'", e); public static void main(string... args) throws Exception { runjob(args[0], args[1]); public static void runjob(string input, String output) throws Exception { Configuration conf = new Configuration(); conf.set("key.value.separator.in.input.line", " "); conf.set("xmlinput.start", "<property>"); conf.set("xmlinput.end", "</property>"); Job job = new Job(conf); job.setjarbyclass(xml.class); job.setoutputkeyclass(text.class); job.setoutputvalueclass(text.class); job.setmapperclass(map.class); job.setinputformatclass(xmlinputformat.class); job.setnumreducetasks(0); job.setoutputformatclass(textoutputformat.class); FileInputFormat.setInputPaths(job, new Path(input)); Path outpath = new Path(output); FileOutputFormat.setOutputPath(job, outpath); outpath.getfilesystem(conf).delete(outpath, true); job.waitforcompletion(true); 我们可以使用 hadoop 内部的 core-site.xml 文件做测试, 如下 : $ bin/hadoop jar xml.jar com.iteblog.hadoop.xml input/core-site.xml output/ 4 / 5

Powered by TCPDF (www.tcpdf.org) 使用 MapReduce 读取 XML 文件 运行完上面的程序, 可以在 output 目录下产生几个 part* 的文件, 这说明解析 XML 文件的程序起作用了 本博客文章除特别声明, 全部都是原创! 转载本文请加上 : 转载自过往记忆 (https://www.iteblog.com/) 本文链接 : () 5 / 5