赞
踩
背景
在不同业务的表使用中,如果不注意数据类型,很容易导致取出数据的字段值为0而导致错误判断。
比如在这个业务场景中业务取出字段为0:原因是二级key作为的是另一个map的key而不是一个属性。
错误取法:rgpnewbehavior.accumulatedbehavior["STATIC:Game_90d"].total.pay_order_cnt
正确取法:rgpnewbehavior.accumulatedBehavior['STATIC:Game_30d_v1']['total'].pay_order_cnt
下面正文对Hive的数据类型做一个总结使用。
原子类型
Hive 是用 Java 开发的,除了String 类型,Hive 里的基本数据类型和 java 的基本数据类型(字符、布尔和数值类)是一一对应的。
复杂类型
复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT):
复合数据类型实践
复合数据类型的优势是把多表关系通过一张表就可以实现,拿学生表举个例子:
SQL CREATE TABLE student( name STRING, -- 爱好有多个,长短不清楚 favors ARRAY<STRING>, -- 课程有多个,每个课程有对应的分数 scores MAP<STRING, FLOAT>, address STRUCT<province:STRING, city:STRING, detail:STRING, zip:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ';' MAP KEYS TERMINATED BY ':' ; |
在关系型数据库中,如果想表达至少需要三张表来关联定义【若考虑范式,需要更多张表】:学生基本信息表(名字,学生id)、爱好表(学生id,爱好)、成绩表(学生id,课程名,成绩)。
数组array
SQL create table person( name string, -- 指定数组类型 location array<string> ) row format delimited fields terminated by "\t" collection items terminated by ","; |
Plain Text vim array.txt Huangbo beijing,shanghai,tianjin,Hangzhou Xuzheng tianjin,chengdu,wuhan Wangbaoqiang wuhan,shenyang,jilin |
SQL load data local inpath '/home/data/array.txt' into table person; |
SQL select * from person; |
查表查出来的字段为两个,第二个是一个数组。
SQL -- 取数组中对应的值 select name, location[1] from person; |
映射map
SQL create table score( name string, -- 设置map类型 scores map<string,int> ) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':'; |
Plain Text vim map.txt huangbo yuwen:80,shuxue:89,yingyu:95 xuzheng yuwen:70,shuxue:65,yingyu:81 wangbaoqiang yuwen:75,shuxue:100,yingyu:75 |
SQL load data local inpath '/home/data/map.txt' into table score; |
SQL select * from score; |
显示两列数据,第二列为map:key和value之间用:,k-v对之间用,作为分隔。
SQL -- 只拿语文的成绩,用通过[key]来拿value。 select s.scores['yuwen'] from score s; |
struct结构
SQL create table structtable( id int, -- 设置struct类型 course struct<name:string,score:int> ) row format delimited fields terminated by '\t' collection items terminated by ','; |
Plain Text vim structtable.txt 1 english,80 2 math,89 3 chinese,95 |
SQL load data local inpath '/home/data/structtable.txt' into table structtable; |
SQL select * from structtable; |
两列,第二列为struct,通过.来获取struct的值。
SQL select course.name, course.score from structtable; |
对Hive数据操作的内置函数可参考:Hive内置函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。