Hive-集合数据类型

发布时间:2022-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Hive-集合数据类型脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

三种集合1)STRUCT和c语言中的struct或者"对象"类似,都可以通过"点"符号访问元素内容。 struct{‘John’, ‘Doe’}2)MAPMAP是一组键-值对元素集合,使用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 delimiteDFields 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,hangzhoulinan 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;OKperson.name person.work_locationsbiansutao ["beijing","shanghai","tianjin","hangzhou"]linan ["changchu","chengdu","wuhan"]Time taken: 0.074 seconds, Fetched: 2 row(s)hive (default)> select name from person;OKnamebiansutaolinanTime taken: 0.14 seconds, Fetched: 2 row(s)hive (default)> select work_locations from person;OKwork_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_c0beijingchangchuTime taken: 0.161 seconds, Fetched: 2 row(s)hive (default)> select work_locations[4] from person;OK_c0NULLNULLTime taken: 0.084 seconds, Fetched: 2 row(s)Map 的使用(1)创建数据库表,以map作为数据类型

create table score(name string,score map<string,int>)row format delimitedfields 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,'英语':95jobs '语文':60,'数学':80,'英语':99导入数据:

load data local inpath '/opt/module/datas/score.txt'overwrite into table default.score;查询数据:

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

Struct 的使用(1)创建数据表

CREATE TABLE test(id int,course struct<course:string,score:int>)ROW FORMAT DELIMITEDFIELDS TERMINATED BY 't'COLLECTION ITEMS TERMINATED BY ',';(2)数据: vim test.txt:

1 english,802 math,893 chinese,95(3)导入到表当中:

load data local inpath '/opt/module/datas/test.txt'into table default.test; (4)查询数据:

hive (default)> select * from test;OKtest.id test.course1 {"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;OKcouseenglishmathchineseTime taken: 0.351 seconds, Fetched: 3 row(s)hive (default)> select course.score from test;OKscore808995Time 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。了解更多大数据培训知识欢迎关注小编!

脚本宝典总结

以上是脚本宝典为你收集整理的Hive-集合数据类型全部内容,希望文章能够帮你解决Hive-集合数据类型所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。