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。
还没有评论,来说两句吧...