由于hive默认使用的SerDe(序列化与反序列化)接口类是
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
,而这个接口是不支持多字符分割的,所以对需要多分隔符数据文件进行导入时,即便指定多字节分隔符,出来的数据一般都是有问题的。
解决方案是使用: org.apache.hadoop.hive.serde2.RegexSeDe
接口,即使用正则接口
案例文件格式如下
:
[hadoop@mycat01 movie]$ head -10 users.dat
1::F::1::10::48067
2::M::56::16::70072
3::M::25::15::55117
4::M::45::7::02460
5::M::25::20::55455
6::F::50::9::55117
7::M::35::1::06810
8::M::25::12::11413
9::M::25::17::61614
10::F::35::1::95370
.....
创建表时指定SerDe:
create table users(
userid bigint,
gender string,
age int,
occupation String,
zipcode String
)
row format serde 'org.apache.hadoop.hive.serder2.RegexSerde'
with serdeproperties('input.regex'='(.*)::(.*)::(.*)','input.format.string'='%1$s %1$s %3$s');
指定SerDe为正则的SerDe: org.apache.hadoop.hive.serder2.RegexSerde
指定serde属性:
-- 由于hive是java开发的,所以正则完全遵循java的格式,例如\\|是对|的转义
input.regex=每一行的正则
-- %1即取上面正则匹配分组的第1组,%2即取第2组,$s则仅仅表示占位符
input.format.string=输出格式