1

入力として次のハイブテーブルがあるとしましょう。それを呼び出しましょうconnections:

userid  | timestamp   
--------|-------------
1       | 1433258019  
1       | 1433258020
2       | 1433258080
2       | 1433258083
2       | 1433258088
2       | 1433258170
[...]   | [...]

次のクエリを使用します。

SELECT
    userid,
    timestamp,
    timestamp - LAG(timestamp, 1, 0) OVER w AS timediff
    CASE
      WHEN timediff > 60
      THEN 'new_session'
      ELSE 'same_session'
    END AS session_state
FROM connections
WINDOW w PARTITION BY userid ORDER BY timestamp ASC;

次の出力を生成しています。

userid  | timestamp   | timediff   | session_state
--------|-------------|------------|---------------
1       | 1433258019  | 1433258019 | new_session
1       | 1433258020  | 1          | same_session
2       | 1433258080  | 1433258080 | new_session
2       | 1433258083  | 3          | same_session
2       | 1433258088  | 5          | same_session
2       | 1433258170  | 82         | new_session
[...]   | [...]       | [...]      | [...]

それを生成するにはどうすればよいですか:

userid  | timestamp   | timediff   | sessionid
--------|-------------|------------------------------
1       | 1433258019  | 1433258019 | user1-session-1
1       | 1433258020  | 1          | user1-session-1
2       | 1433258080  | 1433258080 | user2-session-1
2       | 1433258083  | 3          | user2-session-1
2       | 1433258088  | 5          | user2-session-1
2       | 1433258170  | 82         | user2-session-2
[...]   | [...]       | [...]      | [...]

HQL と「有名な」UDF のみを使用してそれは可能ですか (カスタム UDF やレデューサー スクリプトは使用したくありません)。

4

3 に答える 3

2

興味深い質問です。@Madhu へのコメントに従って、2 1433258172例に行を追加しました。timediff > 60必要なのは、満たされるたびにインクリメントすることです。これを行う最も簡単な方法は、フラグを立ててから、ウィンドウ全体で累積的に合計することです。

クエリ:

select userid
  , timestamp
  , concat('user', userid, '-session-', s_sum) sessionid
from (
  select *
    , sum( counter ) over (partition by userid
                           order by timestamp asc
                           rows between unbounded preceding and current row) s_sum
  from (
    select *
      , case when timediff > 60 then 1 else 0 end as counter
    from (
      select userid
        , timestamp
        , timestamp - lag(timestamp, 1, 0) over (partition by userid
                                                 order by timestamp asc) timediff
      from connections ) x ) y ) z

出力:

1   1433258019  user1-session-1
1   1433258020  user1-session-1
2   1433258080  user2-session-1
2   1433258083  user2-session-1
2   1433258088  user2-session-1
2   1433258170  user2-session-2
2   1433258172  user2-session-2
于 2015-06-06T23:21:51.380 に答える
0

次の select concat_ws('-',name, city) from employee; を使用します。concat_ws の最初のパラメータはセパレータです。name と city は、employee テーブルの列名です。それらが文字列型であることを確認してください。詳しくはこちらをご覧ください

于 2015-06-03T20:23:44.920 に答える