一Hive用正则表达式处理稍复杂数据的导入文件
A正则解析器RegexSerDe
regextserde用法
使用该解析器来处理Apche Web日志数据的一个例子:这个例子好好读读
处理web日志
这个例子也说明了要想使用该解析器是需要导入相应的jar包的。
关于output.format.string" = "%1s s %2ss %3s s %4ss %5s s %6ss %7s s %8ss %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格式。
$ iconv -f gbk -t utf8 dainping.csv > dainping.csv.utf8
3.打开bin/hive命令行
4.在用CSVSerDe之前,先加载jar包
hive (master)> add jar /mnt/modules/apache-hive-2.3.1-bin/lib/csv-serde-1.1.2.jar;
5.建表
可以为行的字段指定字段分隔符、字段内容引用字符和转义字符,例如WITH SERDEPROPERTIES (“separatorChar” = “,”, “quoteChar” = “`”, “escapeChar” = “\“
默认的分隔符是
分隔符:DEFAULT_SEPARATOR , 逗号
引号符:DEFAULT_QUOTE_CHARACTER “引号
转义符:DEFAULT_ESCAPE_CHARACTER \转义符
因此这里采用默认的就能达到以逗号分割,把引号里的作为字段来引用这种效果了。当然这三个都可以自己指定。
上面的建表语句也可以写成:
create external table dianping_csv(
shop_id string,
is_closed string,
name string,
city_id string,
city string,
real_city string,
province string,
area_code string,
phone string,
region string,
address string,
avg_price string,
cross_road string,
big_cate string,
big_cate_id string,
small_cate string,
samll_cate_id string,
stars string,
review_count string,
dishes string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'quoteChar'='\"',
'separatorChar'=',')
location 'hdfs://master:9000/user/hdfs/po*/*/2018';
7查询验证
thupdi_Fei