1、ORC File

Orc是Hive特有的一种列式存储的文件格式,它有着非常高的压缩比和读取效率,因此很快取代了之前的RCFile,成为Hive中非常常用的一种文件格式。

2、编译ORC Jar包

http://orc.apache.org/ 下载源代码orc-1.2.1.tar.gz编译jar包
   用ubuntu14编译,安装jdk1.8、cmake3.2.2、Maven3.0.5。
  解压orc-1.2.1.tar.gz,进入目录orc-1.2.1/java下,执行mvn package编译生成jar文件。
  编译完成后进入
orc-1.2.1/java/mapreduce/target获取orc-mapreduce-1.2.1.jar
orc-1.2.1/java/core/target获取orc-core-1.2.1.jar
orc-1.2.1/java/tools/target获取orc-tools-1.2.1.jar
orc-1.2.1/java/tools/target获取orc-tools-1.2.1-uber.jar
orc-1.2.1/java/ storage-api /target获取hive-storage-api-2.1.1-pre-orc.jar
四个jar包导入到MapReduce工程lib目录下。
注意提交到hadoop集群时,第三方独立jar要一并打包。

3、MR读写ORC File基础代码

import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.output.FileOutputFormat;
import org.apache.orc.mapred.OrcStruct;
import org.apache.orc.mapreduce.OrcInputFormat;
import org.apache.orc.mapreduce.OrcOutputFormat;
import org.apache.orc.TypeDescription;public class ORCSample {public static class ORCMapper extends Mapper<NullWritable, OrcStruct, Text, Text> {private Text oKey=new Text();private Text oValue=new Text();public void map(NullWritable key, OrcStruct value, Context context) throws IOException, InterruptedException {//要知道OrcStruct存储的结构StringBuffer bf = new StringBuffer();            if(value.getNumFields()==3){Text valAcount=(Text)value.getFieldValue(0);Text valDomain=(Text)value.getFieldValue(1);Text valPost=(Text)value.getFieldValue(2);bf.append(valAcount.toString()).append("|").append(valDomain.toString()).append("|").append(valPost.toString());}if (bf.length() > 0) oValue.set(bf.toString());else oValue.set("");oKey.set("");context.write(oKey,oValue);}}/*public static class ORCReducer extends Reducer<Text, Text, Text, Text> {public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {for(Text value:values){String strVal=value.toString();Text okey=new Text();okey.set(strVal);context.write(okey,null);}}}*/public static class ORCReducer extends Reducer<Text, Text, NullWritable, OrcStruct> {//具体OrcStruct字段对应hadoop的定义参考https://orc.apache.org/docs/mapreduce.htmlprivate TypeDescription schema = TypeDescription.fromString("struct<account:string,domain:string,post:string>");private OrcStruct orcs = (OrcStruct) OrcStruct.createValue(schema);private final NullWritable nw = NullWritable.get();public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {for (Text val : values) {if(val.toString() ==null) continue;String[] strVals=val.toString().split("\\|");if(strVals.length==3){Text txtAccount=new Text();txtAccount.set(strVals[0]);orcs.setFieldValue(0, txtAccount);Text txtDomain=new Text();txtAccount.set(strVals[1]);orcs.setFieldValue(1, txtDomain);Text txtPost=new Text();txtAccount.set(strVals[2]);orcs.setFieldValue(2, txtPost);context.write(nw, orcs);}              }}}public static void main(String args[]) throws Exception {Configuration conf = new Configuration();//要设置结构,否则reduce会提示输入空值conf.set("orc.mapred.output.schema","struct<account:string,domain:string,post:string>");Job job = new Job(conf, "ORCSample");  job.setJarByClass(ORCSample.class);job.setMapperClass(ORCMapper.class);job.setReducerClass(ORCReducer.class);//map类型设置job.setInputFormatClass(OrcInputFormat.class);job.setMapOutputKeyClass(Text.class);//优先于setOutputKeyClass生效于mapjob.setMapOutputValueClass(Text.class);//reduce类型设置    job.setNumReduceTasks(1);job.setOutputFormatClass(OrcOutputFormat.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(OrcStruct.class);//job.setOutputKeyClass(Text.class);//对map和reduce输出都生效//job.setOutputValueClass(Text.class);//输入输出路径FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

MapReduce基础开发之十读写ORC File相关推荐

  1. MapReduce基础开发之十二ChainMapper和ChainReducer使用

    1.需求场景:    过滤无意义的单词后再进行文本词频统计.处理流程是: 1)第一个Map使用无意义单词数组过滤输入流: 2)第二个Map将过滤后的单词加上出现一次的标签: 3)最后Reduce输出词 ...

  2. MapReduce基础开发之二数据去重和排序

    因Hadoop集群平台网络限制,只能在eclipse里先写好代码再提交jar到集群平台namenode上执行,不能实时调试,所以没有配置eclipse的hadoop开发环境,只是引入了hadoop的l ...

  3. MapReduce基础开发之八HDFS文件CRUD操作

    HDFS文件操作的基础代码. package com.hive;import java.io.BufferedInputStream; import java.io.BufferedOutputStr ...

  4. MapReduce基础开发之六Map多输入

    在实际MapReduce开发中,会遇到需要数据多输入路径并有对应的Map函数来处理,这需要MultipleInputs.addInputPath(job, path, inputFormatClass ...

  5. MapReduce基础开发之五分布式下载ftp文件到本地再迁移到hdfs

    为利用Hadoop集群平台的分布存储和计算能力,基于MapReduce将ftp文件分布式下载并上传到HDFS中. 1.文件移动流程:ftp服务器->datanode本地目录->HDFS目录 ...

  6. MapReduce基础开发之四参数传递

    Map和Reduce函数是在各节点进行,如果要在MapReduce数据加工中使用共同参数,要如何传参呢?方法有二: 1.Configuration类的set和get的方法读取xml/txt文件设置或自 ...

  7. MapReduce基础开发之三字段处理并输出Hive表

    1.MR设计和开发    1)设计:      输入:用户名 | 数字ip | 时间戳 |  url      MR处理:正则表达式匹配url,满足则解析url并转换ip和时间戳,      输出:用 ...

  8. MapReduce基础开发之十三FileSystem实现本地文件上传

    场景:从本地目录下上传文件到hdfs. 参考代码: package ct.gd;import java.io.BufferedInputStream; import java.io.File; imp ...

  9. MapReduce基础开发之十一DistributedCache使用

    1.需求场景:    过滤无意义的单词后再进行文本词频统计.处理流程是: 1)预定义要过滤的无意义单词保存成文件,保存到HDFS中: 2)程序中将该文件定位为作业的缓存文件,使用Distributed ...

最新文章

  1. 排列和组合简单的递归思路以及C++实现
  2. 实时平台在趣头条的建设实践
  3. hiveserver或者hive启动出现Expected authority at index 7问题解决
  4. C++ float的内存布局
  5. 如何将php改成mp4,PHP 将视频转成 MP4 并获取视频预览图(用到ffmpeg)
  6. android 支付宝月账单 统计图_@三明人 支付宝年度账单来了!今天的你晒账单了吗?...
  7. 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
  8. 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
  9. Android仿人人客户端(v5.7.1)——通过HTTPS协议的POST方式获取用户的基本信息
  10. 使用C#的unsafe加快处理图像速度
  11. 开始我的.NET的学习旅程
  12. 使用OWA无法撰写邮件内容的解决法
  13. 电影《Green book》观后感_已补全:携带着种族歧视的“光环”,艰难地获得朋友的相互依赖,依然得享受生活的酸甜苦咸。...
  14. 字符串str.format()方法
  15. Burg法求解AR(p)模型参数及MATLAB实现
  16. [RK3568 Android11] 开发之调试RK809 codec音频-MIC
  17. ABB机器人的几种停止指令详解
  18. MySQL8.0安装与基于二进制日志文件位置的主从复制
  19. python-恺撒密码 I
  20. WebQQ 2018(一)第一次登录

热门文章

  1. 现代操作系统:第二章 进程和线程
  2. 针对不同的Cookie做页面缓存
  3. 面试题总结(21-40)
  4. 醒来觉得甚是爱你。--朱生豪
  5. ACM/ICPC2014鞍山现场赛E hdu5074Hatsune Miku
  6. 多线程下使用Jedis
  7. iBatis 的插入一个实体
  8. 移动Web单页应用开发实践——页面结构化
  9. 关于不能够精确的对浮点数进行运算的问题
  10. Visual Studio 2005 中的 命令窗口