一Hive用正则表达式处理稍复杂数据的导入文件
A正则解析器RegexSerDe
regextserde用法
使用该解析器来处理Apche Web日志数据的一个例子:这个例子好好读读
处理web日志
这个例子也说明了要想使用该解析器是需要导入相应的jar包的。
关于output.format.string" = "%1 s s %2 ss %3 s s %4 ss %5 s s %6 ss %7 s s %8 ss %9$s
String.format %1s
其中%1 %2表示第1,2个占位符。$s表示用字符串形式替代占位符,是一种格式化输出。
二使用hive处理csv格式文件
csv:逗号分隔值文件
我们右键以记事本打开要处理的csv文件。这里以用八爪鱼爬下来的fang4.csv为例
从图上可以看到,csv数据实际上以逗号作为字段分隔符,但是一般不要直接
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','简单的这样指定分隔符来建表。因为有两个问题:
1.如果列值自身存在逗号,会导致错误
2.有些字符串是加了引号的。
所以如果只是以逗号为分隔符来简单建表的话,会导致一个字段被截成好几个,并且引号也去不掉。阿里云链接里有对比例子。
可以看到这里的csv文件里,只要列值里有逗号的,全都加了引号引起来了,代表是一个整体的字符串。
用OpenCSVSerDe来处理CSV文件。
参考文档:阿里云csv文件格式讲解
csv serde介绍
从https://github.com/ogrodnek/csv-serde/downloads上下载csv-serde-1.1.2.jar包。(用谷歌浏览器下载)
把这个jar包上传到hive下的lib目录里
下面就正式开始处理文件。
1.上传csv文件到linx本地
2.进行编码转换,防止一会出现中文乱码。在csv文件所在目录下将文件转成utf-8编码集
为了防止处理的时候乱码,先把csv格式文件进行类型转换,转换成utf-8格式。
[yaoer@yaoerVM-server1 test]$ iconv -f gbk -t utf8 fang4.csv > fang4.csv.utf8
3.打开bin/hive命令行
4.在用CSVSerDe之前,先加载jar包
hive (building)> add jar /opt/app/apache-hive-1.2.2-bin/lib/csv-serde-1.1.2.jar;
这个貌似只在本hive命令行有效,永久有效的方法暂时还不知。
5.建表
hive (building)> create table test(
> title string,
> url string,
> ht string,
> floor string,
> toward string,
> time string,
> city string,
> county string,
> street string,
> block string,
> address string,
> area double,
> tp double,
> up double,
> turl string,
> sl string
> ) ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’;
可以为行的字段指定字段分隔符、字段内容引用字符和转义字符,例如WITH SERDEPROPERTIES (“separatorChar” = “,”, “quoteChar” = “`”, “escapeChar” = “\“
默认的分隔符是
分隔符:DEFAULT_SEPARATOR , 逗号
引号符:DEFAULT_QUOTE_CHARACTER “引号
转义符:DEFAULT_ESCAPE_CHARACTER \转义符
因此这里采用默认的就能达到以逗号分割,把引号里的作为字段来引用这种效果了。当然这三个都可以自己指定。
上面的建表语句也可以写成:
create table test01(
title string,
url string,
ht string,
floor string,
toward string,
time string,
city string,
county string,
street string,
block string,
address string,
area double,
tp double,
up double,
turl string,
sl string
) ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’
with serdeproperties(
“separatorChar”=”,",
“quoteChar”="\"",
“escapeChar”="\"
);
6加载数据到表
load data local inpath ‘/opt/datas/test/fang4.csv.utf8’ into table test;
7查询验证
hive (building)> select * from test limit 3;
8发现正常,没毛病