原文: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方法