很长时间以来一直写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. Beta阶段——3

    一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 今天主要是对管理员功能进行改进,解决了Alpha阶段出现的一些问题 (2) 今天计划 ...

  2. windows多线程(三) 原子操作

    一.分析上一篇程序的现象 我们先从上一篇文章中的最后一个程序开始分析. #include <stdio.h> #include <windows.h> const unsign ...

  3. vue-cli配置axios

    1. npm install axios --save 2. npm install @type/axios --save-dev(使用ts编写的需要此声明文件,升级的axios好像不需要了,已经自带 ...

  4. 微信小程序 功能函数 获取验证码*

    yanZhengInput: function (e) { var that = this; var yanzheng = e.detail.value; var huozheng = this.da ...

  5. python自动化之连接数据库

    # -*- coding: utf-8 -*- """ Created on Fri Mar 20 10:50:56 2015 @author: sl "&qu ...

  6. js仿QQ拖拽删除

    原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...

  7. 015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

    作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...

  8. MT【150】源自斐波那契数列

    (清华2017.4.29标准学术能力测试7) 已知数列$\{x_n\}$,其中$x_1=a$,$x_2=b$,$x_{n+1}=x_n+x_{n-1}$($a,b$是正整数),若$2008$为数列中的 ...

  9. 模板:插头dp

    前言: 严格来讲有关dp的都不应该叫做模板,因为dp太活了,但是一是为了整理插头dp的知识,二是插头dp有良好的套路性,所以姑且还叫做模板吧. 这里先推荐一波CDQ的论文和这篇博客http://www ...

  10. Android之断点续传下载(转)

    Android之断点续传下载http://www.cnblogs.com/zxl-jay/archive/2011/10/09/2204195.html