如何在 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 中将以下字典格式列转换为不同的格式?

[PY3]——字典中的键如何映射多个值?字典如何排序?

如何通过创建字典从python中的以下映射访问城市名称

如何从 Hive 盒对象中获取密钥并将其映射到对象的特定字段?

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

如何将 Hive 表与 HBase 表映射?