大佬教程收集整理的这篇文章主要介绍了Hive 表复杂类型字段使用,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1.1 map结构数据定义 map<String,String> 1.2 array结构数据定义 array<String> 1.3 struct结构数据定义 struct<id:int,name:string,age:int> 1.4 struct和array嵌套定义 array<struct<id:int,name:string,age:int>>
2.1 map类型 map(key1,val1,key2,val2,....) --使用map函数 2.2 struct类型 struct(val1,val2,val3,..) --使用struct构造器函数,对应列名默认是col1,col2,col3,... named_struct(name1,val1,name2,val2,..) --使用带名称struct构造器函数,指定对应列名 2.3 array类型 array(val1,val2,val3,...) collect_list() 函数 collect_set() 函数
3.1 map map[key] --获取key对应的value 3.2 struct struct.columnName --columnName代表列名 3.3 array arraY[index] --index表示索引值
create table test.employee( name StriNG, salary FLOAT, subordinates ARRAY<String>, deductions MAP<String,String>, address ARRAY<STRUCT<stree:string,city:string,state:string,zip:int>> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; create table test.emp( name StriNG, salary FLOAT, subord String, dedkey String, dedval FLOAT, stree String, city String, state String, zip int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' STORED AS TEXTFILE; insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub001','ded-k01',10.01,'china','beijing','use','100000'); insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub002','ded-k02',20.02,'china-02','shanghai','use','100001'); insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub003','ded-k03',30.03,'china-03','lanzhou','use','100002');
1). 使用COllect_list()组装 ARRAY<String>字段 SELEct name,collect_list(subord) subordinates from test.emp group by name; name subordinates u001 ["sub002","sub003","sub001"] 2). 使用COllect_list()组装 ARRAY<STRUCT<stree:string,city:string,state:string,zip:int>>字段 SELEct name,collect_set(named_struct('stree',stree,'city',city,'state',state,'zip',zip)) address from test.emp group by name; name address u001 [{"stree":"china-02","city":"shanghai","state":"use","zip":100001},{"stree":"china-03","city":"lanzhou","state":"use","zip":100002},{"stree":"china","city":"beijing","state":"use","zip":100000}] 3). 组装Map类型字段 SELEct name,collect_set(named_struct('dedkey',dedkey,'dedval',dedval)) page_stats from test.emp group by name; u001 [{"dedkey":"ded-k02","dedval":20.02},{"dedkey":"ded-k03","dedval":30.03},{"dedkey":"ded-k01","dedval":10.01}] SELEct name,collect_set(concat_ws('=',dedkey,cast(dedval as String))) page_stats from test.emp group by name; u001 ["ded-k02=20.02","ded-k03=30.03","ded-k01=10.01"] -- 第一步: 将key-value字段组装成一个字符串,借助于concat_ws SELEct name,concat_ws(':',dedkey,cast(dedval as String)) kvs from test.emp ; name kvs u001 ded-k03:30.03 u001 ded-k01:10.01 u001 ded-k02:20.02 -- 第二步: 将所有属于同一个人的数据组合在一起,,借助于collect_set SELEct name,collect_set(concat_ws(':',dedkey,cast(dedval as String))) kvs from test.emp group by name; name kvs u001 ["ded-k02:20.02","ded-k03:30.03","ded-k01:10.01"] -- 第三步: 将数组变成一个字符串,借助于concat_ws SELEct name,concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))) kvs from test.emp group by name; name kvs u001 ded-k02:20.02,ded-k03:30.03,ded-k01:10.01 -- 第四步:将字符串转成map 使用函数str_to_map(text, delimiter1, delimiter2) -- text:是字符串 -- delimiter1:多个键值对之间的分隔符 -- delimiter2:key和value之间的分隔符 SELEct name,str_to_map(concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))),",",":") from test.emp group by name; map deductions u001 {"ded-k02":"20.02","ded-k03":"30.03","ded-k01":"10.01"}
with deds as ( SELEct name,str_to_map(concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))),",",":") deductions from test.emp group by name ), adds as( SELEct name,collect_set(named_struct('stree',stree,'city',city,'state',state,'zip',zip)) address from test.emp group by name ), subs as( SELEct name,collect_list(subord) subordinates from test.emp group by name ) insert into table test.employee SELEct coalesce(adds.name,deds.name,subs.Name) name, 25000, subs.subordinates, deds.deductions, adds.address from deds full join adds on deds.name=adds.name full join subs on deds.name=subs.name;
SELECT * from test.employee; employee.name employee.salary employee.subordinates employee.deductions u001 25000 ["sub002","sub003","sub001"] {"ded-k02":"20.02","ded-k03":"30.03","ded-k01":"10.01"} employee.address [{"stree":"china-02","city":"shanghai","state":"use","zip":100001},{"stree":"china-03","city":"lanzhou","state":"use","zip":100002},{"stree":"china","city":"beijing","state":"use","zip":100000}]
@H_660_197@
以上是大佬教程为你收集整理的Hive 表复杂类型字段使用全部内容,希望文章能够帮你解决Hive 表复杂类型字段使用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。