我的输入是一个字符串,可以包含从A到Z的任何字符(没有重复,因此它可能有最多26个字符)。
例如: -
<input type="text" name="text">
字符串中的字符可以按任何顺序出现。
现在我要创建一个地图对象,其中 固定 键从 A 到 Z 。如果其对应的字符出现在输入字符串中,则键的值为1。因此,对于此示例(ATK),地图对象应如下所示: -
那么最好的方法是什么?
因此代码应如下所示: -
set Input='ATK';
它应该返回一个地图对象(set Input='ATK';
select <some logic>;
),其中包含26个键值对。如果不在Hive中创建任何用户定义的函数,最好的方法是什么。我知道有一个函数 str_to_map 很容易想到。但它只有在源字符串中存在键值对时才有效,并且它只会考虑输入中指定的键值对。
答案 0 :(得分: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"}