HIVE自定义TextInputFormat (旧版MapReduceAPI ok, 新版MapReduceAPI实现有BUG?)

我们的输入文件 hello0, 内容如下:

xiaowang 28 [email protected][email protected] 38 [email protected][email protected] 100 unknown

逻辑上有3条记录, 它们以@[email protected]分隔. 我们将分别用旧版MapReduce API 和新版MapReduce API实现自定义TextInputFormat,然后在hive配置使用, 加载数据.

首先用旧版API

1, 自定义Format6继承自TextInputFormat

package MyTestPackage;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobConfigurable;
import org.apache.hadoop.mapred.LineRecordReader;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TaskAttemptContext;
import org.apache.hadoop.mapred.TextInputFormat;  

public class Format6 extends TextInputFormat {

    @Override
    public RecordReader getRecordReader (InputSplit split, JobConf job, Reporter reporter)  throws IOException {
        byte[] recordDelimiterBytes = "@[email protected]".getBytes();
        return new LineRecordReader(job, (FileSplit)split, recordDelimiterBytes);
    }

}

2.导出为MyInputFormat.jar, 放到 hive/lib中

3.在HIVE DDL中配置使用

create table hive_again2(name varchar(50), age int, city varchar(30))
stored as INPUTFORMAT ‘MyTestPackage.Format6‘ OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘;

成功load数据-

新API

1, 自定义Format5继承自TextInputFormat

package MyTestPackage;

import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

public class Format5 extends TextInputFormat {

    @Override
    public RecordReader createRecordReader (InputSplit split, TaskAttemptContext tac) {
        byte[] recordDelimiterBytes = "@[email protected]".getBytes();
        return new LineRecordReader(recordDelimiterBytes);
    }

}

2.导出为MyInputFormat.jar, 放到 hive/lib中

3.在HIVE DDL中配置使用

create table hive_again1(name varchar(50), age int, city varchar(30))
stored as INPUTFORMAT ‘MyTestPackage.Format5‘ OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘;

出错了!

把Format5放到MapReduce中debug一切正常(http://www.cnblogs.com/silva/p/4490532.html), 为什么给hive用就不行了呢? 没明白.. 有知道的同学请指点.谢了!

时间: 05-08

HIVE自定义TextInputFormat (旧版MapReduceAPI ok, 新版MapReduceAPI实现有BUG?)的相关文章

[JIRA] Jira从3.6.2旧版升级到新版6.0.8的详细过程

前言: JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 公司原来用的是JIRA 3.6.2版本,Atlassian官方已不推荐使用JIRA 4.4之前的版本,之前的版本有漏洞也已不再更新,同事已经安装好了JIRA6.0.8版本,新版的JIRA界面扁平化设计,支持移动端浏览,很符合移动互联网企业的风格,现在JIRA升级到了新的版本JIRA 6.1.7,但是在迁移数据的时候,直接从3.6.2迁移到

创建本地RPM源之更新系统旧版软件

事情起因: 系统版本为Centos6.6 ,因为之前同事没有采用最小化选择性安装,所以系统安装好后自带有mysql5.1的三个安装包: [[email protected] ~]# rpm -qa | grep mysql mysql-5.1.73-3.el6_6.x86_64 mysql-devel-5.1.73-3.el6_6.x86_64 mysql-lib-5.1.73-3.el6_6.x86_64 在安装新版本mysql前,只卸载掉了 mysql 和 mysql-devel,但没能成功

(转)Resources和AssetBundle(新旧版)学习

Resources: Resources的缺点:1.与显示Inspector上直接引用相比,Resources使用不方便. 2.不管你Resources上的资源是否调用了,当你发布的时候,Resources上的资源会全部一起打包掉,无法作更新. Resources里的方法: Resources.Load :动态加载特殊文件夹Resources里的文件. Resources.UnloadAsset:回收指定的缓存. Resources.UnloadUnusedAsset:回收没有被引用的缓存 这里

4.6之前旧版动画系统(Animation),AI

一:4.6之前旧版动画系统(Animation)二:4.6版本之后新版动画系统(Animator)方法:动画分割方法:(控制动画播放的动画)1. Play2. CrossFade3. CrofdFadeQueuedIsPlaying()指定的动画是否正在播放Stop()停止播放指定的动画属性:isPlaying:当前是否有动画正在播放 Rig标签中的Animation Type要是Legacy(旧版动画系统) 动画融合(通过指定关节来播放动画) 动画帧事件(当动画播放到某一帧时执行指定的方法,比

51CTO博客旧版首页截图纪念

2017年7月11日,51CTO博客PC端首页进行改版,这个曾经陪伴了多年的旧版首页已经超期服役,将告别历史舞台,但它也承载了我们很多作者的光荣与梦想.承载了我们很多阅读的时光.特将旧版首页截图保存,以作留念.

一招解决OpenERP8.0安装旧版模块报错

有喜欢尝鲜的网友开始玩8.0了,可是版本还没发布,社区的很多特别好的模块还没有升级到8,所以经常碰到模块无法安装的问题. No module name osv 网友提出将模块的 from osv import osv,fields 改为 from openerp.osv import osv,fields 其实这是一个编程规范问题,旧版模块代码里很多这种导入方式,一个一个改对于不懂代码的或者openerp新手是不现实的. 众所周知,openerp的运行入口是openerp-server.py,在

Hive自定义函数的学习笔记(1)

前言: hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到, 因此hive提供了自定义函数的接口, 方便用户扩展. 自己好像很久没接触hadoop了, 也很久没博客了, 今天趁这个短期的项目, 对hive中涉及的自定义函数做个笔记. 准备: 编写hive自定义函数前, 需要了解下当前线上hive的版本. hive --vesion 比如作者使用到的hive

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/

[Hive]Hive自定义函数UDF

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数 用户自定义函数(user defined function),针对单条记录. 编写一个UDF,需要继承UDF类,并实现evaluate()函数.在查询执行过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化.对于每行输入都会调用到evaluate()函数.而evaluate()函数处理的值会返回给Hive.同时用户是可以重载evaluate方法的.Hive会像Java的方法重载一样,自动选择匹配的