如何在 Hive 中使用字典进行映射?
Posted
技术标签:
【中文标题】如何在 Hive 中使用字典进行映射?【英文标题】:How would I use a dictionary for mapping in Hive? 【发布时间】:2021-11-03 13:47:34 【问题描述】:假设我有一个表'my_table':
region_code | name
123 | 'test'
54 | 'test2'
还有一本字典:
dict = (123 -> "Moscow", 54 -> "Saint Petersburg")
我想做:
select dict[region_code] as region_code, name from my_table
获取:
region_code | name
'Moscow' | 'test'
'Saint Petersburg'| 'test2'
这在 hive 中可行吗?
【问题讨论】:
【参考方案1】:Dict 是一个地图,您可以使用 map() 构造创建地图并在查询中使用。
演示:
with my_table as(--demo dataset, use real table instead
select 123 region_code, 'test' name union all
select 54,'test2'
)
select region_code,
map(123, "Moscow", 54, "Saint Petersburg")[region_code] as region_name,
name
from my_table;
结果:
region_code region_name name
123 Moscow test
54 Saint Petersburg test2
另外,如果你多次使用 dict,你可以使用变量:
--declare variable
set hiveconf:region_code_name_map=map(123, "Moscow", 54, "Saint Petersburg");
with my_table as(
select 123 region_code, 'test' name union all
select 54,'test2'
)
select region_code,
--use variable substitution
$hiveconf:region_code_name_map[region_code] as region_name,
name
from my_table;
或者使用宏+变量:
--declare variable
set hiveconf:region_code_name_map=map(123, "Moscow", 54, "Saint Petersburg");
--create a macro
create temporary macro code2name(code int) $hiveconf:region_code_name_map[code];
with my_table as(
select 123 region_code, 'test' name union all
select 54,'test2'
)
select region_code,
--use macro
code2name(region_code) as region_name,
name
from my_table
所有这些演示示例都产生相同的结果。也只能对地图内容进行参数化:123, "Moscow", 54, "Saint Petersburg"
,您可以将变量放入查询中的 map() 构造中。
【讨论】:
以上是关于如何在 Hive 中使用字典进行映射?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive 或 Presto 中将以下字典格式列转换为不同的格式?
如何从 Hive 盒对象中获取密钥并将其映射到对象的特定字段?