1

ハイブ テーブルの列でシーケンスを検出しようとしています。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 y が連続していることは気にしません。x から y へ、x から y へと移動したことに興味があるだけです。

これが可能かどうかはわかりません。group by と partition の組み合わせを試しましたが、成功しませんでした。

4

1 に答える 1

0

OPがアイテムをリストに収集し、繰り返しアイテムを削除したいというこの質問に答えました。これは本質的にあなたがやりたいことだと思います。これにより、実際の シーケンスが抽出され、発生xyxyする2番目の例も説明されますが、2つの余分なsxyxyによって曇っています。このUDAFを使用して列を配列yに収集する必要があります-これにより順序が保持されます-次に、参照したUDFを使用してから、この配列の内容を文字列にするために使用できます。最後に、その文字列を確認します希望するシーケンスの発生。この関数は、最初に出現した場所を吐き出し、文字列が見つからない場合はゼロを返します。labelconcat_wsinstr

クエリ:

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

labelより良い代替手段は、単にUDF で収集し、それを文字列にしてから、シーケンスを正規表現することかもしれませんがxyxy、私は正規表現がかなり苦手なので、他の誰かがこれについて知的にコメントできる可能性があります。

于 2015-07-22T15:03:10.463 に答える