Hive-集合数据类型

除了使用础的数据类型string等,Hive中的列支持使用struct, map, array集合数据类型。

三种集合

1)STRUCT
和C语言中的struct或者"对象"类似,都可以通过"点"符号访问元素内容。 struct{‘John’, ‘Doe’}
2)MAP
MAP是一组键-值对元素集合,使用key可以访问元素。 map(‘fisrt’, ‘John’, ‘last’, ‘Doe’)
3)ARRAY
数组是一组具有相同数据类型和名称的变量的集合。 Array(‘John’, ‘Doe’)
补充的知识点:

row format delimited fields terminated by ','	--  (字段分隔符)列分隔符
collection items terminated by '_'	--MAP STRUCT  和 ARRAY  的分隔符(数据分割符号) 
map keys terminated by ':'	-- MAP 中的 key 与 value 的分隔符
lines terminated by '\n';	--  行分隔符

Array的使用

(1)创建数据库表,以array作为数据类型

create table person(
name string,
work_locations array<string>
)
row format delimited
fields terminated by '\t' 
collection items  terminated by ',';

这里面有一个点是需要注意:row format delimited fields terminated by ‘\t’ 代表的是字段用tab键进行分割,同时,写完之后是没有加逗号的,\t末尾是空的!!!
collection items terminated by ','代表的是集合用逗号分割!!!

(2)在本地 /opt/module/datas目录下建立文件person.txt:

biansutao	beijing,shanghai,tianjin,hangzhou
linan	changchu,chengdu,wuhan

导入到hive person表当中:

load data local inpath '/opt/module/datas/person.txt' overwrite into table default.person;

(3)查询数据:

hive (default)> select * from person;
OK
person.name	person.work_locations
biansutao	["beijing","shanghai","tianjin","hangzhou"]
linan	["changchu","chengdu","wuhan"]
Time taken: 0.074 seconds, Fetched: 2 row(s)
hive (default)> select name from person;
OK
name
biansutao
linan
Time taken: 0.14 seconds, Fetched: 2 row(s)
hive (default)> select work_locations from person;
OK
work_locations
["beijing","shanghai","tianjin","hangzhou"]
["changchu","chengdu","wuhan"]
Time taken: 0.13 seconds, Fetched: 2 row(s)
hive (default)> select work_locations[0] from person;
OK
_c0
beijing
changchu
Time taken: 0.161 seconds, Fetched: 2 row(s)
hive (default)> select work_locations[4] from person;
OK
_c0
NULL
NULL
Time taken: 0.084 seconds, Fetched: 2 row(s)

Map 的使用

(1)创建数据库表,以map作为数据类型

create table score(
name string,
score map<string,int>
)
row format delimited
fields terminated by '\t' 
collection items terminated by ','
map keys terminated by ':';

以map为主要数据结构的时候,我一开始是没有写collection items terminated by ','这句分隔符的,我的想法是:map只要分割到map keys就可以,但是后面load data的时候才发现了问题,问题就出在如果map的字段是多个键值对,其中用逗号隔开,导入数据就会出错。

(2) 编辑vim score.txt:

biansutao	'数学':80,'语文':89,'英语':95
jobs	'语文':60,'数学':80,'英语':99

导入数据:

load data local inpath '/opt/module/datas/score.txt'
overwrite into table default.score;

查询数据:

hive (default)> select score["'数学'"] from score;
OK
_c0
80
80

我发现一个问题,当我设置map的key为中文的字符时,在选取的时候,总会出现一些奇奇怪怪的问题,上面这条数据也是试了好几次才取到这条数据,以后在开发过程中尽量不写中文。总结:map选取key取到对应value的方法就是: 字段名[‘key’].
取这个数据的时候,又发现了一个注意点就是:表名可以和字段名相同!!!

Struct 的使用

(1)创建数据表

CREATE TABLE test(id int,course struct<course:string,score:int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ',';

(2)数据: vim test.txt:

1	english,80
2	math,89
3	chinese,95

(3)导入到表当中:

load data local inpath '/opt/module/datas/test.txt'
into table default.test; 

(4)查询数据:

hive (default)> select * from test;
OK
test.id	test.course
1	{"couse":"english","score":80}
2	{"couse":"math","score":89}
3	{"couse":"chinese","score":95}
Time taken: 0.075 seconds, Fetched: 3 row(s)
hive (default)> select course.couse from test;
OK
couse
english
math
chinese
Time taken: 0.351 seconds, Fetched: 3 row(s)
hive (default)> select course.score  from test;
OK
score
80
89
95
Time taken: 0.105 seconds, Fetched: 3 row(s)

类型转换

在Hive中,TINYINT可以转化为INT,但是HIVE不会进行反向转化,例如,某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。
隐式类型转换规则如下:
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成INT,INT 可以转换成 BIGINT。
(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
(4)BOOLEAN 类型不可以转换为任何其它的类型。

可以使用 CAST 操作显示进行数据类型转换
例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行 CAST(‘X’ AS INT),表达式返回空值 NULL。


版权声明:本文为weixin_43586713原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。