2016-09-07 10 views
0

Apache Hive SQLのさまざまなWebサイトからWebサイトのデータを分析していますが、どのドメインが顧客の旅に関係しているかを調べたいと思います。ハイブSQL(グループの最初の値)のクリックストリームデータを集計するCTE SQL

id1 domain 
--- --- 
1 1 
1 3 
1 1 
1 2 
3 4 
3 5 
6 7 
6 6 
6 7 

これはHIVEで行うことができる方法:

id1 domain 
--- --- 
1 1 
1 1 
1 1 
1 3 
1 1 
1 2 
3 4 
3 5 
3 5 
6 7 
6 6 
6 7 

が、私はこの構造にデータを変換したいと思い、正しい方法でデータを分析する: クリックストリームデータは、以下の構造を有していましたSQL?

どのタッチポイントがどのシーケンス/オーダーに含まれているかを調べ、ドメイン間の冗長クリックを取り除く必要があります。 Ultimatlyこの穴クエリは、このようなテーブルにつながるはず:

1: 1>3>1>2 
3: 4>5 
6: 7>6>7 

私はそれが巣箱具体的な質問だと言うではないでしょう!

答えて

0

解決策は、ハイブdosen'tサポート相関サブクエリに見える...あなたのawnserため

SELECT * FROM (
SELECT id 
     ,domain 
     ,LAG(domain) OVER (PARTITION BY id ORDER BY date) AS lag_domain 
FROM t_domain 
) t1 
WHERE lag_domain NOT LIKE domain 
1

私はハイブのためにcteを使うことができます。私はvarchar(100)を文字列に変更しなければならないと思います。

;WITH list (id1 , domain, [level], list) 
    AS (
    SELECT id1, domain, 1, CAST(domain AS varchar(100)) AS list 
    FROM Hivetable 
    WHERE domain IS NOT NULL 

    UNION ALL 

    SELECT list.id1, conn.domain, list.[level]+1, 
      CAST(list+' <- '+CAST(conn.domain AS varchar(100)) AS varchar(100)) AS list 
    FROM list 
    INNER JOIN Hivetable AS conn ON list.domain=conn.id1 
    WHERE conn.domain IS NOT NULL) 

SELECT id1, list AS blockedByChain 
FROM list 
WHERE [level]=(SELECT MAX(sub.[level]) FROM list AS sub WHERE sub.id1=list.id1) 
ORDER BY id1, [level], domain; 
+0

おかげです。その周りに別の方法がありますか? – Duesentrieb

+0

私はその問題自体についてさらに詳しく知りたいと思います。あなたはどのように集約の問題に名前をつけますか?ありがとう – Duesentrieb