关于hive中的array,map,struct

array<数据类型>

弹珠警察 白宝,黑宝,蓝宝,绿宝
龙珠超 孙悟空,贝吉塔,比鲁斯,布罗利

#建表语句
create table if not exists arr1(
province string,
city array<String>
)
row format delimited fields terminated by '\t'
collection items terminated by ',' #使用逗号分割数组元素
;
#加载数据
load data local inpath '/root/hivedata/arr.txt' into table arr1;
#结果查询
hive (test)> select * from arr2;
OK
弹珠警察        ["白宝","黑宝","蓝宝","绿宝"]
龙珠超  ["孙悟空","贝吉塔","比鲁斯","布罗利"]
Time taken: 0.094 seconds, Fetched: 2 row(s)

这样,一个字段应该被存进数组(集合)的值就被存进了数组(集合)。

#直接通过下表查询
hive (test)> select province,city[0] from arr2 ;
OK
弹珠警察        白宝
龙珠超  孙悟空
Time taken: 0.13 seconds, Fetched: 2 row(s)

也可以对其展开(行转列)

hive (test)> select province,person from arr2 lateral view explode(city) city as person;
OK
弹珠警察        白宝
弹珠警察        黑宝
弹珠警察        蓝宝
弹珠警察        绿宝
龙珠超  孙悟空
龙珠超  贝吉塔
龙珠超  比鲁斯
龙珠超  布罗利
Time taken: 0.127 seconds, Fetched: 8 row(s)

也可以将上一步转成列的数据再转成行

hive (test)> select province,collect_set(person) as city 
           > from (select province,person from arr2 lateral view explode(city) city as person) t1
           > group by province
           > ;
......
OK
弹珠警察        ["白宝","黑宝","蓝宝","绿宝"]
龙珠超  ["孙悟空","贝吉塔","比鲁斯","布罗利"]
Time taken: 1.839 seconds, Fetched: 2 row(s)

map<键类型,值类型>

拉面 面:200,牛肉:50,葱花:10
黄焖鸡 米:200,鸡肉:150,土豆:300

#建表
create table if not exists map1(
uname string,
itemIds map<String,int>
)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
;
#加载数据
load data local inpath '/root/hivedata/map.txt' into table map1;
#查看
hive (test)> select * from map1;
OK
map1.uname      map1.itemids
拉面    {"面":200,"牛肉":50,"葱花":10}
黄焖鸡  {"米":200,"鸡肉":150,"土豆":300}
Time taken: 0.1 seconds, Fetched: 2 row(s)

查询数据(通过键获取值)

hive (test)> select uname,itemIds['面'] from map1;
OK
拉面    200
黄焖鸡  NULL
Time taken: 0.17 seconds, Fetched: 2 row(s)

展开(行转列)

hive (test)> select uname,name,num from map1 lateral view explode(itemIds) Ids as name,num; 
OK
拉面    面      200
拉面    牛肉    50
拉面    葱花    10
黄焖鸡  米      200
黄焖鸡  鸡肉    150
黄焖鸡  土豆    300
Time taken: 0.124 seconds, Fetched: 6 row(s)

拼接(concat)

hive (test)> select uname,concat(name,':',num) from (select uname,name,num from map1 lateral view explode(itemIds) Ids as name,num)t1;
OK
拉面    面:200
拉面    牛肉:50
拉面    葱花:10
黄焖鸡  米:200
黄焖鸡  鸡肉:150
黄焖鸡  土豆:300
Time taken: 0.143 seconds, Fetched: 6 row(s)

hive (test)> select uname,collect_set(concat(name,':',num)) from ( select uname,name,num from map1 lateral view explode(itemIds) Ids as name,num) t1 group by uname;
......
OK
拉面    ["面:200","牛肉:50","葱花:10"]
黄焖鸡  ["米:200","鸡肉:150","土豆:300"]
Time taken: 1.736 seconds, Fetched: 2 row(s)

struct<键:类型,键:类型…>

张三 河南省,洛阳市,月亮区,快乐大街11号
李四 河北省,石家庄市,太阳区,幸福大街21号

#建表
create table if not exists str(    
uname string,     
addr struct  < province:string,city:string,xian:string,dadao:string >) 
row format delimited fields terminated by '\t'    
collection items terminated by ',';
#加载数据
load data local inpath '/root/hivedata/struct.txt' into table str;
#查看
hive (test)> select * from str;
OK
str.uname       str.addr
张三    {"province":"河南省","city":"洛阳市","xian":"月亮区","dadao":"快乐大街11号"}
李四    {"province":"河北省","city":"石家庄市","xian":"太阳区","dadao":"幸福大街21号"}
Time taken: 0.086 seconds, Fetched: 2 row(s)

查询

hive (test)> select uname,addr.province,addr.city from str;
OK
uname   province        city
张三    河南省  洛阳市
李四    河北省  石家庄市
Time taken: 0.072 seconds, Fetched: 2 row(s)

总结:感觉array,map,struct是层层递进的,在前一层的基础上增加变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值