从字符串到 Hive 中的映射对象
Posted
技术标签:
【中文标题】从字符串到 Hive 中的映射对象【英文标题】:from string to map object in Hive 【发布时间】:2016-11-24 08:36:21 【问题描述】:我的输入是一个字符串,可以包含从 A 到 Z 的任何字符(没有重复,因此最多可以有 26 个字符)。
例如:-
set Input='ATK';
字符串中的字符可以按任意顺序出现。
现在我想创建一个地图对象,它具有从 A 到 Z 的 固定 键>。如果对应的字符出现在输入字符串中,则键的值为 1。所以在这个例子(ATK)的情况下,地图对象应该看起来像:-
那么最好的方法是什么?
所以代码应该是这样的:-
set Input='ATK';
select <some logic>;
它应该返回一个包含 26 个键值对的映射对象 (Map<string,int>
)。最好的方法是什么,而不在 Hive 中创建任何用户定义的函数。我知道有一个很容易想到的函数 str_to_map。但它只有在源字符串中存在键值对时才有效,而且它只会考虑输入中指定的键值对。
【问题讨论】:
将它们存储为1:[A, K, T], 0:[B, C, ..., Z]
似乎更合乎逻辑
没关系。问题是关于最佳地确定输入字符串中的每个字符是否存在于较大的字符串(A,B,C,...,Z)中。实际的输入字符串将来自列值。您能否使用示例查询展示您想到的逻辑?
【参考方案1】:
可能效率不高但有效:
select str_to_map(concat_ws('&',collect_list(concat_ws(":",a.dict,case when
b.character is null then '0' else '1' end))),'&',':')
from
(
select explode(split("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z",',')) as dict
) a
left join
(
select explode(split($hiveconf:Input,'')) as character
) b
on a.dict = b.character
结果:
"A":"1","B":"0","C":"0","D":"0","E":"0","F":"0","G":"0","H":"0","I":"0","J":"0","K":"1","L":"0","M":"0","N":"0","O":"0","P":"0","Q":"0","R":"0","S":"0","T":"1","U":"0","V":"0","W":"0","X":"0","Y":"0","Z":"0"
【讨论】:
以上是关于从字符串到 Hive 中的映射对象的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Hive 盒对象中获取密钥并将其映射到对象的特定字段?