hive的文件的记录格式serde

版权声明:版权声明中 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的文件

    1. 新建一个txt文件:注意因为我们默认的是用","号做的分割符号中间只能用他来分割。在这里插入图片描述
    2. 将文件另存为.csv格式的文件。在这里插入图片描述在这里插入图片描述
    3. 确定格式在这里插入图片描述
  • 将数据上传到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全为数字的才能匹配进去。

猜你喜欢

转载自blog.csdn.net/lds_include/article/details/88791703