トレジャーデータにおいて、hiveでこれまで書いていたクエリをprestoで書くことになりました
prestoはpostgresの書き方と同じなので、postgres に変換できれば大丈夫です
以下コード例です。
DISTRIBUTE BY COALESCE(user_id, TD_MD5(concat(useragent,ip))) SORT BY COALESCE(user_id, TD_MD5(concat(useragent,ip))), time
の部分、そのままpostgresでは使えません、、どのように変換すればよいでしょうか
そもそもこのクエリで正確にセッションが取得できているでしょうか
SELECT
1 TD_TIME_FORMAT(min(time), 'yyyy-MM-dd HH:mm:ss', 'JST') as session_start_time, 2 TD_TIME_FORMAT(max(time), 'yyyy-MM-dd HH:mm:ss', 'JST') as session_end_time, 3 session_id, 4 user_id, 5 -- TD_PARSE_USER_AGENTを利用してUAからOSの文字列を取得し、PC/SDを判定 6 CASE 7 WHEN TD_PARSE_USER_AGENT( 8 TD_LAST( 9 useragent, 10 time 11 ), 'os_family' 12 ) IN( 13 'Android', 14 'iOS', 15 'Windows Phone', 16 'Windows RT' 17 ) THEN 'sd' 18 ELSE 'pc' 19 END device, 20 -- セッションの一番最初のリファラURL(流入元)を取得 21 TD_FIRST(referer, time) as referer, 22 -- セッションの一番最初のURL(ランディングページ)を取得 23 TD_FIRST(url, time) as lp, 24 -- セッションの一番最後のURL(離脱ページ)を取得 25 TD_LAST(url, time) as exit_page, 26 COUNT(1) as views, 27 -- ランディングページのGoogleAnalyticsのパラメータを取得 28 parse_url( 29 TD_FIRST(url, time), 30 'QUERY', 31 'utm_source' 32 ) as ga_utm_source, 33 -- PV数が1のものに直帰フラグを設定 34 CASE 35 WHEN COUNT(1) = 1 THEN 1 ELSE 0 36 END bounce_flg, 37 -- セッションの終了と開始時間から滞在時間を計算 38 MAX(time) - MIN(time) as duration 39FROM ( 40 -- user_idをキーに30分でセッションIDを生成 41 SELECT 42 time, 43 ip, 44 user_id, 45 url, 46 referer, 47 useragent, 48 TD_SESSIONIZE( 49 time, 50 1800, 51 user_id 52 ) AS session_id 53 FROM 54 ( 55 -- user_idが空の場合にUA+IPをキーに擬似user_idを生成。セッションIDを生成するため、user_id、timeでソート 56 SELECT 57 time, 58 ip, 59 COALESCE(user_id, TD_MD5(concat(useragent,ip))) as user_id, 60 url, 61 referer, 62 useragent 63 FROM 64 demo_www_access 65 ** DISTRIBUTE BY COALESCE(user_id, TD_MD5(concat(useragent,ip))) SORT BY COALESCE(user_id, TD_MD5(concat(useragent,ip))), time** 66 ) t0 67) t1 68GROUP BY session_id, user_id```

あなたの回答
tips
プレビュー