自定义hive的Inputformat

项目背景:

本公司需要处理一份数据,这份数据有这样的特点,一行数据长度是1924个,一共有88个字段,且知道每个字段按顺序的长度。但是如果直接创建表的话也是行的,只不过写很复杂的正则表达式。而且效率方面可能有问题的。然后现在的想法是自定义Inputformat的符号,往每个字段后面加一个hive默认的“\001”符号,这样创建表就会简单很多,而且有可能会提高表的查询的效率(因为还没测试过)。

项目环境:

hadoop-2.3.0-cdh5.0.0

hive-0.12.0-cdh5.0.0

Eclipse

操作步骤:

1:定义好文件,代码如下:

package org.dongfangguoxin.test;

import java.io.IOException;

import org.apache.hadoop.io.*;

import org.apache.hadoop.mapred.*;

public class MyDemoInputFormat extends TextInputFormat {

public String toUseString(int[] ints,String a){

int beginIndex=0;

int endIndex=0;

int sum=0;

StringBuffer s=new StringBuffer("");

for (int i = 0; i < ints.length; i++) {

sum+=ints[i];

endIndex=sum;

String c=a.substring(beginIndex, endIndex);

//System.out.println(c);

beginIndex=sum;

s.append(c+"\001");

}

// System.out.println(s);

return s.toString();

}

@Override

public RecordReader<LongWritable, Text> getRecordReader(

InputSplit genericSplit, JobConf job, Reporter reporter)

throws IOException {

reporter.setStatus(genericSplit.toString());

MyDemoRecordReader reader = new MyDemoRecordReader(

new LineRecordReader(job, (FileSplit) genericSplit));

return reader;

}

public static class MyDemoRecordReader implements

RecordReader<LongWritable, Text> {

LineRecordReader reader;

Text text;

public MyDemoRecordReader(LineRecordReader reader) {

this.reader = reader;

text = reader.createValue();

}

@Override

public void close() throws IOException {

reader.close();

}

@Override

public LongWritable createKey() {

return reader.createKey();

}

@Override

public Text createValue() {

return new Text();

}

@Override

public long getPos() throws IOException {

return reader.getPos();

}

@Override

public float getProgress() throws IOException {

return reader.getProgress();

}

@Override

public boolean next(LongWritable key, Text value) throws IOException {

while (reader.next(key, text)) {

int[] ints=new int[]{4,8,8,15,50,6,4,10,15,6,4,2,12,2,24,14,14,10,200,500,20,32,15,15,15,15,16,16,6,17,2,2,10,10,10,14,16,16,2,12,2,15,3,15,10,30,5,10,3,8,10,64,5,26,2,12,2,2,4,2,30,5,4,2,30,24,60,48,16,15,40,10,16,16,20,20,16,10,4,6,10,10,10,24,24,24,24,24};

String str=text.toString();

MyDemoInputFormat ift=new MyDemoInputFormat();

String strReplace= ift.toUseString(ints, str);

Text txtReplace = new Text();

txtReplace.set(strReplace);

value.set(txtReplace.getBytes(), 0, txtReplace.getLength());

return true;

}

return false;

}

}

}

弄好后打成jar包,放到hive_home/lib里面

然后原来的创建表的语句是:

create table tab_lixiyuan1(

OBJECT_ID            string,

DISTINCT_ID          string,

SORTING_ID           string,

FILE_ID              string,

OUT_FILE_ID          string,

TICKET_ID            string,

USING_TYPE           string,

FILE_DIS_ID          string,

AB_FILE_ID           string,

AB_TICKET_ID         string,

AREA_ID              string,

SORTING_MOTION       string,

ABNORMAL_TYPE        string,

TICKET_TYPE          string,

FEE_NUMBER           string,

BEGIN_TIME           string,

END_TIME             string,

BILL_TIMES           string,

BILL_LIST            string,

BYTES_LIST           string,

BILL_BYTES           string,

SERV_CODE            string,

ASCEND_BYTES1        string,

DOWN_BYTES1          string,

ASCEND_BYTES2        string,

DOWN_BYTES2          string,

IMSI                 string,

IMEI                 string,

LAC                  string,

CELL_ID              string,

DEALER               string,

ROAM_DEALER          string,

CALL_AREA_ID         string,

VISIT_AREA_ID        string,

USER_PROV            string,

USER_ROAMPROV        string,

SGSN_SERV_IP         string,

GGSN_PGW_IP          string,

PDP_FLAG             string,

PDP_FEE_CLASS        string,

PDP_TYPE             string,

PDP_CAMEL            string,

IMS_PDP_ID           string,

SERV_FEE             string,

INFO_FEE             string,

FEE_CLASS            string,

RECORD_ID            string,

MB_ABILITY           string,

RECORD_ROUTE         string,

RECORD_LAC           string,

RECORD_CELL_ID       string,

APN_ID               string,

APN_TYPE             string,

APN_DEALER           string,

SGSNING_ID           string,

SGSN_PLMN            string,

ROAM_TYPE            string,

USER_TYPE            string,

SERV_TYPE            string,

SHUTDOWN_REASON      string,

ADD_BYTE             string,

USER_BILL_FLAG       string,

RAT_FLAG             string,

BILL_FLAG_MODE       string,

GSN_ID               string,

CAMEL_INFO           string,

USER_ACCOUNT         string,

AP_INFO              string,

INCONTROL_IP         string,

NAS_IP               string,

AP_SSID              string,

BILL_DES             string,

PDNCC_ID             string,

USER_CSG_INFO        string,

IPV4_ADD             string,

IMSSIGNALING         string,

PGWADD_USERD         string,

PDNTYPE_IP           string,

SERV_PRI             string,

WIRELESS_PRI         string,

UPBANDWIDTH          string,

DOWNBANDWIDTH        string,

BANDWIDTH            string,

RESERVED1            string,

RESERVED2            string,

RESERVED3            string,

RESERVED4            string,

RESERVED5            string

) partitioned by (month_id string,prov_id string,day_id string,week_id string,hour_id string) row format serde ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe‘ with serdeproperties (  ‘input.regex‘ = ‘(....)(........)(........)(...............)(..................................................)(......)(....)(..........)(...............)(......)(....)(..)(............)(..)(........................)(..............)(..............)(..........)(........................................................................................................................................................................................................)(....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................)(....................)(................................)(...............)(...............)(...............)(...............)(................)(................)(......)(.................)(..)(..)(..........)(..........)(..........)(..............)(................)(................)(..)(............)(..)(...............)(...)(...............)(..........)(..............................)(.....)(..........)(...)(........)(..........)(................................................................)(.....)(..........................)(..)(............)(..)(..)(....)(..)(..............................)(.....)(....)(..)(..............................)(........................)(............................................................)(................................................)(................)(...............)(........................................)(..........)(................)(................)(....................)(....................)(................)(..........)(....)(......)(..........)(..........)(..........)(........................)(........................)(........................)(........................)(........................)‘,‘output.format.string‘ = ‘%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$s %11$s %12$s %13$s %14$s %15$s %16$s %17$s %18$s %19$s %20$s %21$s %22$s %23$s %24$s %25$s %26$s %27$s %28$s %29$s %30$s %31$s %32$s %33$s %34$s %35$s %36$s %37$s %38$s %39$s %40$s %41$s %42$s %43$s %44$s %45$s %46$s %47$s %48$s %49$s %50$s %51$s %52$s %53$s %54$s %55$s %56$s %57$s %58$s %59$s %60$s %61$s %62$s %63$s %64$s %65$s %66$s %67$s %68$s %69$s %70$s %71$s %72$s %73$s %74$s %75$s %76$s %77$s %78$s %79$s %80$s %81$s %82$s %83$s %84$s %85$s %86$s %87$s %88$s‘)

用了这个自定义的函数以后创建表的语句为:

CREATE TABLE tab_lixiyuan

(

a string ,b string ,c string ,d string,dds string,e string,f string ,g string,

aa string ,ba string ,ca string ,da string,daa string,ea string,fa string ,ga string,

ab string ,bb string ,cb string ,db string,dba string,eb string,fb string ,gb string,

ac string ,bc string ,cc string ,dc string,dca string,ec string,fc string ,gc string,

ad string ,bd string ,cd string ,dd string,dda string,ed string,fd string ,gd string,

ha string ,ia string ,ja string ,ka string ,la string ,ma string ,na string ,haa string ,

hb string ,ib string ,jb string ,kb string ,lb string ,mb string ,nb string ,hba string ,

hc string ,ic string ,jc string ,kc string ,lc string ,mc string ,nc string ,hca string ,

hd string ,id string ,jd string ,kd string ,ld string ,md string ,nd string ,hda string ,

he string ,ie string ,je string ,ke string ,le string ,me string ,ne string ,hea string ,

hf string ,iff string ,jf string ,kf string ,lf string ,mf string ,nf string ,hfa string

)

STORED AS INPUTFORMAT ‘org.dongfangguoxin.test.MyDemoInputFormat‘ OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘

搞定收工!

时间: 2024-07-31 21:33:37

自定义hive的Inputformat的相关文章

如何编写自定义hive UDF函数

Hive可以允许用户编写自己定义的函数UDF,来在查询中使用.Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行: UDAF:操作多个数据行,产生一个数据行. UDTF:操作一个数据行,产生多个数据行一个表作为输出. 用户构建的UDF使用过程如下: 第一步:继承UDF或者UDAF或者UDTF,实现特定的方法. UDF实例参见http://svn.apache.org/repos/asf/hive/trunk/contrib/src/java/org/apache/hadoop/hi

[Hadoop] - 自定义Mapreduce InputFormat&amp;OutputFormat

在MR程序的开发过程中,经常会遇到输入数据不是HDFS或者数据输出目的地不是HDFS的,MapReduce的设计已经考虑到这种情况,它为我们提供了两个组建,只需要我们自定义适合的InputFormat和OutputFormat,就可以完成这个需求,这里简单的介绍一个从MongoDB中读数据,并写出数据到MongoDB中的一种情况,只是一个Demo,所以数据随便找的一个. 一.自定义InputFormat MapReduce中Map阶段的数据输入是由InputFormat决定的,我们查看org.a

hive添加永久自定义函数

永久自定义hive函数 1:做这件事的原因: 有一些函数是比较基础的,公用的,每次都要create temporary function麻烦了,这样的基础函数需要直接集成到hive中去,避免每次都要创建. 2:步骤 本人拥有一个账户zb_test 自定义的函数已经准备好 登陆linux账户,修改该账户的home目录下的.bashrc文件: 把CLASSPATH改成如下: export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/

Hive体系结构(四)注意事项与扩展特性

Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. 使用HIVE注意点 字符集 Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用. 备注:中文数据load到表里面,,如果字符集不同,很有可能全是乱码需要做转码的,但是hive本身没有函数来做这个. 压缩 hive.exec.compress.output 这个

Hive学习(九)Hive体系结构

1.Hive架构与基本组成 下面是Hive的架构图. 图1.1 Hive体系结构 Hive的体系结构可以分为以下几部分: (1)用户接口主要有三个:CLI,Client 和 WUI.其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本.Client是Hive的客户端,用户连接至Hive Server.在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server. WUI是通过浏览器访问Hive. (2)Hive将元数据存储在数据库中

Hive 体系结构介绍

下面是Hive的架构图. 图1.1 Hive体系结构 Hive的体系结构可以分为以下几部分: (1)用户接口主要有三个:CLI,Client 和 WUI.其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本.Client是Hive的客户端,用户连接至Hive Server.在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server. WUI是通过浏览器访问Hive. (2)Hive将元存储在数据库中,如mysql.derby.Hi

Hadoop企业级完整训练:Rocky的16堂课(HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;Zookeeper&amp;Sqoop&amp;Pig&amp;Flume&amp;Project) - 0515

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐进的掌握Hadoop是本课程的核心.   云计算学习者的心声: 如何从企业级开发的角度,不断动手实际操作,循序渐进中掌握Hadoop,直到能够直接进行企业级开始,是困惑很多对云计算感兴趣的朋友的核心问题,本课程正是为解决此问题而生,学习者只需要按照一步步的跟着视频动手操作,即可完全无痛掌握Hadoo

hive不支持多个字符作为分隔符的解决方案

题记: 近期在做某个大型银行的大数据项目,当在处理非结构化数据时,却发现他们给的数据并不符合hive和pig的处理要求,数据每行必须需要多个分割符才能完美处理,一下午也没有想到完美的办法解决,今天重新审视了一下整个过程.看来hive的命令行没法搞定了.于是乎,只能通过代码来搞定. 1.重新实现hive的InputFormat了,别急放码过来 package hiveStream; import java.io.IOException; import org.apache.hadoop.io.Lo

Hadoop企业级完整训练:HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;Zookeeper&amp;Pig&amp;Project)

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐进的掌握Hadoop是本课程的核心. 云计算学习者的心声: 如何从企业级开发的角度,不断动手实际操作,循序渐进中掌握Hadoop,直到能够直接进行企业级开始,是困惑很多对云计算感兴趣的朋友的核心问题,本课程正是为解决此问题而生,学习者只需要按照一步步的跟着视频动手操作,即可完全无痛掌握Hadoop企