通常情况下,我们创建的都是单分隔符的Hive表,但是在实际业务环境中,多数情况下使用的是多分隔符,本篇文章我们探究下Hive多分隔的用法以及注意事项。
单分隔符示例:
create table hello(name string,code timestamp)
row format delimited fields terminated by ','
lines terminated by '\n'
stored as textfile;
说明:上述示例中采用“,”作为列分隔,“\n”作为行分隔。
多分隔符使用:
第一种:使用org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe接口
CREATE EXTERNAL TABLE IF NOT EXISTS inform(
BINGLIJLXH STRING ,
JILUNR STRING
)COMMENT '内容注释'
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ('field.delim'='\001$^#G','line.delim'='\002H-Q^V', 'serialization.format'='\001$^#G')
STORED AS TEXTFILE
location '/user/hive/temp';
说明:'\001$^#G','\002H-Q^V','\001$^#G'表示多分隔符,其中\001,\002表示Hive默认隐藏分隔符,是不可见字符,\001在vim里面表示^A,\002表示^B。
\001 ^A ,需要按照CTRL+V+A打出,不是shift+^+B
\002 ^B,需要按照CTRL+V+B打出,不是shift+^+B
sed -e 's/|/\^A$^#G/g' data.txt
sed -i 's/|/\^A$^#G/g' data.txt 替换但分隔符“|”为多分隔符“\001$^#G”,^需要转义
备注:-e表示只编辑不修改文件内容;-i表示修改文件内容。
第二种:使用org.apache.hadoop.hive.contrib.serde2.RegexSerDe接口(正则)
create external table inform(a string, b string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "^(.*)\\$\\%\\#(.*)$")
location '/user/hive/temp';
分隔符使用不正确,会出现count数目不正确或者insert会插入到第一个字段中,其余字段中没有数据。