很长时间以来一直写hive,嵌套脚本、偶尔写UDF.  最近用Hive的dynamic partition和多路插入做一些事情,很遗憾的结果是非常不稳定,有时能成功,有时失败。(可能是因为hive版本的问题,查了一些资料也没查的太清楚,因为服务器不能随便动,就想用mapreduce的多路输出吧)。

1.首先这个多路插入也是用的hive的表,表的输出是SequenceFile格式。

按说sequencefile格式输入,取决于内部的Key/value格式。

在驱动类里需要添加

Job job=new Job(getConf(),"dsp_data");
  job.setInputFormatClass(SequenceFileInputFormat.class);
  SequenceFileInputFormat.addInputPath(job, input1);
  SequenceFileInputFormat.addInputPath(job, input2);

Mapper函数的输入:

public class * extends Mapper<BytesWritable , Text, TextPair,TextPair>{}

2.MultipleOutPuts使用:

private static Text value = new Text();
 private MultipleOutputs<Text, Text> mos;
 @Override
 protected void setup(Context context)  throws IOException, InterruptedException {
  Configuration conf = context.getConfiguration();
  mos = new MultipleOutputs<Text,Text>(context); 
 }

Iterator<TextPair> iter = values.iterator();
  TextPair middle=iter.next();
  if (! middle.getSecond().equals("0")) return;
//  String[] middle_fields=middle.getFirst().toString().split("\t",-1);
  
  
  while(iter.hasNext()){
   TextPair xx=iter.next(); 
   if (xx.getSecond().toString().equals("0")) continue;
   String[] xx_fields=xx.getFirst().toString().split("\t");
   if(xx_fields.length<3) continue;
   String custom_id=xx_fields[xx_fields.length-1];
   value.set(xx_fields[0]+"\t"+xx_fields[1]+"\t"+middle.getFirst().toString());
   mos.write(key.getFirst(), value, custom_id+"/");    
  }

@Override
 protected void cleanup(Context context)
   throws IOException, InterruptedException {
  super.cleanup(context);
  mos.close();
 }

 3.上面的语句有点问题。

在于middle的使用,因为reduce中iterable values使用的对象都是反序列化出来的,而指定的具体的类都是由一个初始化的对象,不断更新里面的字段实现的。

上面的例子,就造成了middle指向的对象没变,但是实际对象中的内容已经被更新成了新序列化的结果,得不到middle最初赋值地方的值。

解决办法有两个:将middle中,需要的数据部分事先取出来。   另外一个实现TextPair的clone或者实现一个get方法,获得一个新对象来解决。

MapReduce (hive表SequenceFile的结果做输入)、MultipleOutputs和Reduce端迭代iterable的一些说明的更多相关文章

  1. 表单 用jquery做输入脱离焦点 进行正则验证

    <!-- 账号登录块 -->       <form class="form1" action="" method="get&quo ...

  2. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  3. 导hive表项目总结(未完待续)

    shell里面对日期的操作 #!/bin/bash THIS_FROM=$(date +%Y%m%d -d "-7 day") THIS_TO=$(date +%Y-%m-%d - ...

  4. 从零自学Hadoop(15):Hive表操作

    阅读目录 序 创建表 查看表 修改表 删除表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceL ...

  5. spark+hcatalog操作hive表及其数据

    package iie.hadoop.hcatalog.spark; import iie.udps.common.hcatalog.SerHCatInputFormat; import iie.ud ...

  6. hive表的存储格式; ORC格式的使用

    hive表的源文件存储格式有几类: 1.TEXTFILE 默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理.源文件可以直接通过hadoop fs -cat 查 ...

  7. Hive使用SequenceFile存储数据

    SequenceFile是使用二进制保存数据,是可以压缩的,并且压缩后的数据可被分割,可以供mapreduce处理. 下面的实例使用SequenceFile保存Hive表的数据,并且使用了压缩. se ...

  8. hive 表优化

    一.外部表和内部表的区别 (1)创建表时指定external关键字,就是外部表,不指定external就是内部表 (2)内部表删除后把元数据和数据都删除了,外部表删除后只是删除了元数据,不会删除hdf ...

  9. hive和hbase本质区别——hbase本质是OLTP的nosql DB,而hive是OLAP 底层是hdfs,需从已有数据库同步数据到hdfs;hive可以用hbase中的数据,通过hive表映射到hbase表

    对于hbase当前noSql数据库的一种,最常见的应用场景就是采集的网页数据的存储,由于是key-value型数据库,可以再扩展到各种key-value应用场景,如日志信息的存储,对于内容信息不需要完 ...

随机推荐

  1. Week2-作业1-part2.阅读与思考

    第一章.概论 原文: 在成熟的航空工业中,一个飞机发动机从构思到最后运行,不知道经历过多少人.多少工序.多少流程.多少相关知识的验证.我们无法想象,某个商用型号的发动机在飞行时发现问题,最初的设计师会 ...

  2. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (一) 配置与测试

    引脚连接说明 与树莓派的连线 NRF24L01 => 树莓派 GND          =>   GND VCC          =>    3.3V CE           = ...

  3. JPEG标准推荐的亮度、色度DC、AC Huffman编码表

    JPEG 标准推荐的亮度.色度DC.AC Huffman 编码表 博主在完成数字图像处理大作业时利用搜索引擎查找了很久完整的四张Huffman 编码表(亮度AC Huffman编码表.亮度DC Huf ...

  4. Java-JDBC.mysql 工具类 读取本地文件配置

    引用 mysql-connector-jav 的jar 配置文件为  database.propertties .  格式如下 driverClass=com.mysql.jdbc.Driver ur ...

  5. 基于JQuery的前端form表单操作

    Jquery的前端表单操作:     jquery提供了良好的方法封装,在一些基本的操作的时候,能节省很多的麻烦,其中,在具体使用时,form表单的数据提交是最频繁也最常见的前后数据交换方式,所以在前 ...

  6. Hystrix 容错处理

    目录 雪崩效应 容错的基本思想 什么是Hystrix 简单使用 消费端使用Hystrix 注解开启 改造消费方法 @HystrixCommand 详细配置 Hystrix线程隔离策略与传播上下文 Hy ...

  7. 多示例学习 multiple instance learning (MIL)

    多示例学习:包(bags) 和 示例 (instance). 包是由多个示例组成的,举个例子,在图像分类中,一张图片就是一个包,图片分割出的patches就是示例.在多示例学习中,包带有类别标签而示例 ...

  8. CodeForces - 988C(STL大法好)

    请你找出两个编号不同的数列,并从这两个数列中各恰好删除一个数,使得这两个数列的和相等. 用vector存每一个数 用map标记 即可 #include <bits/stdc++.h> us ...

  9. WampServer3.0允许局域网访问配置教程

    wamp server 下的Apache默认设置是不允许外网访问和局域网访问的,而直接搜索 wamp局域网访问配置,出现都是一些旧版本的wamp的配置信息,最新版本3.0.X需要使用以下配置方法: 配 ...

  10. oracle +plsql装完省略号不能点

    1.如图 2.复制 TNS 服务名 3.复制到 登录框的 Database ,输入用户名密码,点OK..可以进去了,省略号变成可点击状态