我有一个字段,其中包含固定长度的ID的简短列表。
例如aab:aac:ada:afg
该字段最多可容纳5个ID,并逐渐增加。我通过从可能与我现有集合部分重叠的类似构造字段中添加来进行更新。 ada:afg:fda:kfc
。
当连接到“ update”表时,该字段将扩展,如以下示例所示。
这里,id_list
是我要“合并”的上述列表,而table_update是具有要“合并”到table1的新值的表。
insert overwrite table table1
select
id,
field1,
field2,
case
when (some condition) then a.id_list
else merge(a.id_list, b.id_list)
end as id_list
from table1 a
left join
table_update b
on a.id = b.id;
我想产生一个具有以下值的组合字段:
aab:aac:ada:afg:fda
。
挑战在于,在执行之前,我不知道字符串是否重叠或重叠多少,而且我无法运行任何外部代码或创建UDF。
有什么建议可以解决这个问题吗?
答案 0 :(得分:1)
拆分以获取数组,$ perl -e'
$SIG{PIPE} = "IGNORE";
sleep(2);
END { print "foo\n"; }
' | perl -e'sleep(1)'
Unable to flush stdout: Broken pipe
,选择现有的explode
,使用union all
进行聚合,将产生唯一的数组,并使用collect_set
将数组连接为字符串。未经测试:
concat_ws()
在合并为数组之前,可以使用select concat_ws(':',collect_set(id))
from
(
select explode(split('aab:aac:ada:afg',':')) as id --existing
union all
select explode(split('ada:afg:fda:kfc',':')) as id --new
);
代替UNION
来获取不同的值。或者,您可以将新的和现有的以及连接的字符串连接成一个,然后执行相同的操作:
UNION ALL
在实际查询中,您很可能需要将select concat_ws(':',collect_set(id))
from
(
select explode(split(concat('aab:aac:ada:afg',':','ada:afg:fda:kfc'),':')) as id --existing+new
);
与lateral view
一起使用。请参阅this关于横向视图用法的答案
更新:
explode