hive java导入CVS

原文:http://bbs.chinahadoop.cn/thread-5343-1-1.html

----------------------------------------------------------------------------------

本文的目的是hive读取cvs文件,忽略字段中‘\,’,最终还是以','来分割文本
cvs格式是以逗号','隔开的文件格式,文本中可能在字段里又包含了逗号转义符号‘\,’
文件格式举例:
1,2,5,(hah\,ahojg)
如果用hive自带的分隔符建表:
create table IF NOT EXISTS test_table(p_id INT,tm INT,idate INT,url STRING)
partitioned by (dt string)
row format delimited fields terminated by ','   或者为 '\,' 
STORED AS INPUTFORMAT
'com.hadoop.mapred.DeprecatedLzoTextInputFormat'  
OUTPUTFORMAT  
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
location '/hdfs/data/incoming';
结果都会被分为:1 2 5 (hah\ ahojg)
因为hive只识别一个字符的分隔符,所以需要我们编写自己的input/output format
下面这段代码是网上截取的,将多个分隔符换成hive自带的\001
想要忽略‘\,’的目的,建红色的代码修改如下即可:
//先将‘\,’换成'@' ,处理完逗号分隔符,再将'@' 换成 '\,'
String repalceString_01 = value.toString().replace("\\,", "@");
String repalceString_02 = repalceString_01.replace(",", "\001");
String strReplace = repalceString_02.replace("@", "\\,");

------------------------------------------------------------------------------------------------------
步骤:myeclipse中建立java工程,根目录下新建lib目录,添加hadoop和常用的jar包

  • 编写自定义InputFormat(MutilCharInputFormat
  • 编写自定义MutilCharRecordReader实现RecordReader接口,并重写next方法
编写自定义Input Format
01 package com.icloud.hive;

02 import java.io.IOException;

03 import org.apache.commons.logging.Log;

04 import org.apache.commons.logging.LogFactory;

05 import org.apache.hadoop.io.LongWritable;

06 import org.apache.hadoop.io.Text;

07 import org.apache.hadoop.mapred.FileSplit;

08 import org.apache.hadoop.mapred.InputSplit;

09 import org.apache.hadoop.mapred.JobConf;

10 import org.apache.hadoop.mapred.RecordReader;

11 import org.apache.hadoop.mapred.Reporter;

12 import org.apache.hadoop.mapred.TextInputFormat;

13  

14 public class MutilCharInputFormat extends TextInputFormat{

15 private static final Log log = LogFactory.getLog(MutilCharRecordReader.class);

16  

17 @Override

18 public RecordReader<LongWritable, Text> getRecordReader(

19 InputSplit genericSplit, JobConf job, Reporter reporter)

20 throws IOException {

21 reporter.setStatus(genericSplit.toString());

22 //创建MutilCharRecordReader并返回

23 return new MutilCharRecordReader((FileSplit)genericSplit,job);

24 }

25 }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值