版权声明:版权声明中 https://blog.csdn.net/lds_include/article/details/88791703
hive的文件的记录格式serde
一、概念
- 就是表中数据生成的文件的记录的格式,中途涉及到表到文件时是序列化的过程(Serializer)、文件到表的时候是反序列化过程(Deserializer)。
二、常见的serde
- CSV serde:逗号分割值,有时也称为字符分隔值,因为分隔字符也可以不是逗号。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
- tsv serde:设置它的separatorChar=’\t’
- json serde:json格式的分割
- RegEx(正则)serde:正则表达式的分割
- parqut serde:
三、具体讲解
1、CSV serde
- 创建记录为csv格式的表:
create table if not exists csv(
id int,
name string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
;
-
创建.csv的文件
- 新建一个txt文件:注意因为我们默认的是用","号做的分割符号中间只能用他来分割。
- 将文件另存为.csv格式的文件。
- 确定格式
-
将数据上传到hive中去
load data local inpath "localpath/mycsv.csv" into table csv;
- 创建复杂的csv表格
create table if not exists csv(
id int,
name string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties(
'separatorChar'=',',//指定分割符
'qutoChar'='"',//指定字段的引号
'escapeChar'="\"//指定转移符
)
store as textfile;
2、json serde:解析复杂的json
- 首先要将json的jar包上传到服务器上面去。
- 将上传的jar包引入到hive中去
hive>add jar /localpath/json-serde-1.3-jar-with-dependencies.jar;
- 确定文件格式
{"provice":"山西","city":["大同","临汾","太原"],"person":{"man":[100,200,50],"woman":[80,120,30]}}
{"provice":"河北","city":["石家庄","保定","唐山"],"person":{"man":[200,300,80],"woman":[100,160,89]}}
格式是:
string,Array<String>,map<String,Array<Int>>
- 由格式创建表
create table if not exists json(
provice string,
city Array<String>,
person map<String,Array<Int>>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
;
- 上传数据
load data local inpath "localpath/file" into table json;
- 测试
##查询城市多与三个的并且青年妇女人数大于80万的数据
select * from json3 where size(city) >=3 and person["woman"][0] > 80;
regex serde:正则匹配
- 确定数据
220.196.111.12 [10/Jan/2018:00:02:00 + 0800]
220.197.111.12 [10/Jan/2018:00:02:00 + 0800]
220.19C.111.12 [10/Jan/2018:00:02:00 + 0800]
220.ax1.111.12 [10/Jan/2018:00:02:00 + 0800]
220.198.111.12 [10/Jan/2018:00:02:00 + 0800]
- 创建表
create table if not exists regex(
host string,
data string
)
row format serde'org.apache.hadoop.hive.serde2.RegexSerDe'
with serderproperties(
"input.regex" = "^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}(.*)$)"
)
stroed as textfile
;
- 说明:这里面的with serderproperties参数就是将每个数据进行一下正则匹配能够匹配的就进入,不能匹配的就不让进入
- 加载数据
load data local inpath"localpath/file"into table regex;
- 检测
select * from regex;
- 说明:只有ip全为数字的才能匹配进去。