从字符串到配置单元中的Map对象

vnjpjtjt  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(315)

我的输入是一个字符串,可以包含从a到z的任何字符(没有重复,所以最多可以有26个字符)。
为了example:-

set Input='ATK';

字符串中的字符可以以任何顺序出现。
现在我想用它创建一个map对象,它有从a到z的固定键。如果键的对应字符出现在输入字符串中,则该键的值为1。所以在这个例子(atk)中,map对象应该看起来like:-

那么最好的方法是什么呢?
所以代码应该看起来like:-

set Input='ATK';
select <some logic>;

它应该返回一个map对象( Map<string,int> )其中包含26个键值对。最好的方法是什么,而不必在配置单元中创建任何用户定义的函数。我知道有一个很容易想到的函数str\u to\u map,但它只在源字符串中存在键值对时才起作用,而且它只考虑输入中指定的键值对。

dvtswwa3

dvtswwa31#

可能效率不高,但有效:

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"}

相关问题