除了使用础的数据类型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。