使用前导功能检测蜂巢列中的序列
Posted
技术标签:
【中文标题】使用前导功能检测蜂巢列中的序列【英文标题】:detect sequence in hive column with lead function 【发布时间】:2015-07-21 22:58:43 【问题描述】:我正在尝试在我的配置单元表的列中检测一个序列。我有 3 列 (ID、标签、索引)。每个id都有一个标签序列,index是标签的顺序,比如
id label index
a x 1
a y 2
a x 3
a y 4
b x 1
b y 2
b y 3
b y 4
b x 5
b y 6
我想识别x,y,x,y的标签序列是否出现。 我正在考虑尝试一个领导功能来完成这个,比如:
select id, index, label,
lead( label, 1) over (partition by id order by index) as l1_fac,
lead( label, 2) over (partition by id order by index) as l2_fac,
lead( label, 3) over (partition by id order by index) as l3_fac
from mytable
产量:
id index label l1_fac l2_fac l3_fac
a 1 x y x y
a 2 y x y NULL
a 3 x y NULL NULL
a 4 y NULL NULL NULL
b 1 x y y y
b 2 y y y x
b 3 y y x y
b 4 y x y NULL
b 5 x y NULL NULL
其中 l1(2,3) 是下一个标签值。然后我可以用
检查模式where label = l2_fac and l1_fac = l3_fac
这适用于 id = a,但不适用于标签序列为:x、y、y、y、y、x 的 id = b。我不在乎它是连续 3 年,我只是感兴趣它从 x 到 y 再到 x 到 y。
我不确定这是否可能,我尝试了 group by 和 partition 的组合,但没有成功。
【问题讨论】:
您是否关心何时序列xyxy
出现?即它发生在什么index
?还是您只想知道它发生在 somewhere 对于给定的id
?
不,我不在乎什么索引,只要它发生。
【参考方案1】:
我回答了this question,OP 想要将项目收集到列表中并删除任何重复的项目。我认为这基本上是你想要做的。这将提取 实际 xyxy
序列,并且还可以解释出现 xyxy
的第二个示例,但被额外的 2 个 y
s 覆盖。您需要使用this UDAF 将label
列收集到一个数组中——这将保留顺序——然后使用我引用的UDF,然后你可以使用concat_ws
使这个数组的内容成为一个字符串,并且最后,检查该字符串是否出现您想要的序列。函数instr
将吐出第一次出现的位置,如果找不到字符串则为零。
查询:
add jar /path/to/jars/brickhouse-0.7.1.jar;
add jar /path/to/other/jar/duplicates.jar;
create temporary function remove_seq_dups as 'com.something.RemoveSequentialDuplicates';
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';
select id, label_string, instr('xyxy', label_string) str_flg
from (
select id, concat_ws('', no_dups) label_string
from (
select id, remove_seq_dups(label_array) no_dups
from (
select id, collect(label) label_array
from db.table
group by id ) x
) y
) z
输出:
id label_string str_flg
============================
a xyxy 1
b xyxy 1
更好的选择可能是简单地使用 UDF 收集 label
,使其成为一个字符串,然后正则表达式输出序列 xyxy
,但我在正则表达式方面非常糟糕,所以可能其他人可以对此进行智能评论。
【讨论】:
我希望得到一个非 udf 的答案,但我会尝试的。谢谢。以上是关于使用前导功能检测蜂巢列中的序列的主要内容,如果未能解决你的问题,请参考以下文章