分享

hive表map类型如何实现插入

mvs2008 发表于 2017-5-26 17:06:16 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 8 27684
本帖最后由 mvs2008 于 2017-5-26 17:08 编辑

[mw_shl_code=sql,true]--建表如下:

---A存储爱好信息,map类型存储
create table if not exists test.A
(
id int,
hobby map<string,string)
)
row format delimited
collection items terminated by ','
map keys terminated by ':'
stored as orc;
---B具体爱好信息,多行
create table if not exists test.B
(
h_id int,
type string,
name string
)
stored orc;[/mw_shl_code]


若B表内容:
h_id type name
1 电影 惊悚
1 音乐 摇滚


如何将B表内容插入A表?
插入后:
id hobby
1 {"电影":"惊悚","音乐":"摇滚"}

请教下各位大神,求sql语句。




已有(8)人评论

跳转到指定楼层
mvs2008 发表于 2017-5-27 17:46:53
发现一个内置function:str_to_map。
实现如下:

[mw_shl_code=sql,true]insert overwrite table test.A
select
h_id,
str_to_map(concat_ws(',',collect_set(concat(type,":",name)))) as tags
from
test.B
group by
h_id;[/mw_shl_code]

A表中数据:
id hobby
1 {"电影":"惊悚","音乐":"摇滚"}

回复

使用道具 举报

NEOGX 发表于 2017-5-26 17:45:15
二者的表结构要一致。直接应该不可以的。
可以做成文档,直接加载进来。
回复

使用道具 举报

flownclouds 发表于 2017-5-26 17:50:22
谢谢分享,需要学习的东西太多了。
回复

使用道具 举报

mvs2008 发表于 2017-5-27 14:59:56
NEOGX 发表于 2017-5-26 17:45
二者的表结构要一致。直接应该不可以的。
可以做成文档,直接加载进来。

先保存成文件然后再加载时可以的,不知道直接insert的话是否行得通。

回复

使用道具 举报

NEOGX 发表于 2017-5-27 15:26:14
mvs2008 发表于 2017-5-27 14:59
先保存成文件然后再加载时可以的,不知道直接insert的话是否行得通。

直接insert没有尝试过。楼主可以写成对应格式,尝试下
回复

使用道具 举报

mvs2008 发表于 2017-5-27 15:29:41
NEOGX 发表于 2017-5-27 15:26
直接insert没有尝试过。楼主可以写成对应格式,尝试下

单行是可以insert的,用map(col1,col2)就可以,例如:
id hobby
1 {"电影":"惊悚"}

如果是多行拼到一起就不知道如何实现了
id hobby
1 {"电影":"惊悚","音乐":"摇滚"}
回复

使用道具 举报

desehawk 发表于 2017-5-27 16:03:21
mvs2008 发表于 2017-5-27 15:29
单行是可以insert的,用map(col1,col2)就可以,例如:
id hobby
1 {"电影":"惊悚"}

单行可以说明是没有问题的,不能多行的,否则插入就混乱了。换行的话,自动换行应该没有问题。不要使用回车等
回复

使用道具 举报

为梦狂野 发表于 2018-9-25 14:58:09
mvs2008 发表于 2017-5-27 17:46
发现一个内置function:str_to_map。
实现如下:

非常棒,只有借助这个str_to_map才能成功插入。
我使用如下:
drop table logbase.user_house_hot_tag;
create table logbase.user_house_hot_tag(
city_id string,
user_id string,
tag_p MAP<string,string>
) partitioned by (l_date string,tag_name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';


insert overwrite table logbase.user_house_hot_tag partition(l_date='2018-09-24',tag_name='elevator')
select
  NULL city_id,
  x.user_id,
  str_to_map(concat("1",":",round((elevator_1/elevator_all),3))) as tag_p
from
(
select
  user_id,
  sum(case when elevator = 1 then elevator*view_nums end) as elevator_1,
  sum(view_nums) as elevator_all
from logbase.pc_wap_app_wechat_user_house_tag
where l_date='2018-09-18'
and user_id='1148940'
group by user_id
) x;

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条