在我的hive表中有一个名为tags的字符串数组。我想用','分隔符连接这个数组中的每个元素,并形成一个字符串。然而,在加入时,我不想加入字符串,如果它不包含':'字符。
我想这样做的原因是,一旦字符串连接,它应该变成,a:1,b:2,c:3。然后我要应用str_to_map使它成为一个字典。现在我的str_to_map失败了,如果输入的元素中没有包含':'。
最小失败输入:["abc-xyz-1"]
SELECT
CAST(SPLIT(hostname, '-')[1] AS BIGINT) AS host_id,
str_to_map(concat_ws(',', tags)) AS tags,
stack_trace
FROM test_events;
我建议"爆炸";将数组数据放入单独的行中,这允许在concat_ws中的每个元素上使用IF。像这样(未经测试的代码):
SELECT
CAST(SPLIT(hostname, '-')[1] AS BIGINT) AS host_id,
str_to_map(concat_ws(',',
IF(instr(tag, ':') > 0, tag, NULL)
)) AS tags,
stack_trace
FROM test_events
LATERAL VIEW explode(tags) exploded_tags AS tag
GROUP BY CAST(SPLIT(hostname, '-')[1] AS BIGINT), stack_trace;
参考:侧面视图&爆炸
我必须承认,我不能完全确定是否需要这个小组,但我已经假设它是需要的。
我建议尝试下面的代码片段:
SELECT hostname, stack_trace, tag
FROM test_events
LATERAL VIEW explode(tags) exploded_tags AS tag
WHERE instr(tag, ':') > 0
应该避免没有":"的标签,如果你改变where子句,你可以找到不符合的标签。