如何使用Apache Hive合并2个部分重叠的字符串?

时间:2018-09-02 14:46:33

标签: sql hive hiveql

我有一个字段,其中包含固定长度的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。

有什么建议可以解决这个问题吗?

1 个答案:

答案 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