【入門編】TreasureDataでWEBログ分析をしてみた


この記事は Treasure Data Advent Calendar 2015 – Qiita の24日目の記事です。

こんにちは。

今回はWEBログの集計や解析をする際によく使うHiveQLのクエリと、UDF(User Defined Functions)について実際の集計クエリを使って解説していきたいと思います。
これからTreasureDataを使う人やTreasureDataを使い始めたばかりの人向けの内容になっています。

今回やったこと

利用したWEBログテーブル

以下のような一般的なWEBログを利用しました。
このログを元に標準的なアクセス解析用データを生成する集計クエリを書いてみます。

カラム名 内容
time アクセス日時
ip アクセス元IPアドレス
url アクセスしたページのURL
referer リファラURL
useragent ユーザーエージェント
user_id ユーザID(Cookie)

 

実際のテーブルは以下のようになっています。
td_demo_www_access

実行したクエリ

具体的には、WEBログからセッション単位のデータを作成しています。

[sql]
SELECT
TD_TIME_FORMAT(min(time), ‘yyyy-MM-dd HH:mm:ss’, ‘JST’) as session_start_time,
TD_TIME_FORMAT(max(time), ‘yyyy-MM-dd HH:mm:ss’, ‘JST’) as session_end_time,
session_id,
user_id,
— TD_PARSE_USER_AGENTを利用してUAからOSの文字列を取得し、PC/SDを判定
CASE
WHEN TD_PARSE_USER_AGENT(
TD_LAST(
useragent,
time
), ‘os_family’
) IN(
‘Android’,
‘iOS’,
‘Windows Phone’,
‘Windows RT’
) THEN ‘sd’
ELSE ‘pc’
END device,
— セッションの一番最初のリファラURL(流入元)を取得
TD_FIRST(referer, time) as referer,
— セッションの一番最初のURL(ランディングページ)を取得
TD_FIRST(url, time) as lp,
— セッションの一番最後のURL(離脱ページ)を取得
TD_LAST(url, time) as exit_page,
COUNT(1) as views,
— ランディングページのGoogleAnalyticsのパラメータを取得
parse_url(
TD_FIRST(url, time),
‘QUERY’,
‘utm_source’
) as ga_utm_source,
— PV数が1のものに直帰フラグを設定
CASE
WHEN COUNT(1) = 1 THEN 1 ELSE 0
END bounce_flg,
— セッションの終了と開始時間から滞在時間を計算
MAX(time) – MIN(time) as duration
FROM (
— user_idをキーに30分でセッションIDを生成
SELECT
time,
ip,
user_id,
url,
referer,
useragent,
TD_SESSIONIZE(
time,
1800,
user_id
) AS session_id
FROM
(
— user_idが空の場合にUA+IPをキーに擬似user_idを生成。セッションIDを生成するため、user_id、timeでソート
SELECT
time,
ip,
COALESCE(user_id, TD_MD5(concat(useragent,ip))) as user_id,
url,
referer,
useragent
FROM
demo_www_access
DISTRIBUTE BY COALESCE(user_id, TD_MD5(concat(useragent,ip))) SORT BY COALESCE(user_id, TD_MD5(concat(useragent,ip))), time
) t0
) t1
GROUP BY session_id, user_id
[/sql]

結果

クエリの実行結果は以下のようなものになります。
resultdata

クエリ解説

それでは、実際のクエリで使っているUDFについて解説していきたいと思います。

TD_MD5

公式ドキュメント: https://docs.treasuredata.com/articles/udfs#tdmd5

 

文字列から、md5のハッシュ値を生成する関数です。

今回何に使ったかというと、利用したWebログで利用しているユーザIDが3rdPartyCookieであるため、iOS Safariなどのブラウザではブランクになってしまっています。
ユーザIDがないとセッション単位の集計もできません。除外してしまってもいいのですが、ある程度の分析は行いたいので、擬似的にユーザIDを生成しました。

具体的にはユーザーエージェントとIPアドレスを結合した文字列からmd5でハッシュを生成し、擬似ユーザIDとしています。

TD_SESSIONIZE

公式ドキュメント: https://docs.treasuredata.com/articles/udfs#tdsessionize
 

今回のWebログをセッション単位にデータにする上で、一番重要な関数です。

time値でソートし、タイムアウトを30分、セッションID生成の単位をユーザIDとしています。
ポイントとしては、事前に「distribute by」、「sort by 」を使って、ユーザID単位にtimeカラムでソートしておくことです。

TD_PARSE_USER_AGENT

公式ドキュメント: https://docs.treasuredata.com/articles/udfs#tdparseuseragent
 

これも非常に便利な関数で、Webログの解析ではよく利用します。ユーザーエージェントを元にOSやブラウザの判定をしてくれます。

TD_FIRST

公式ドキュメント: https://docs.treasuredata.com/articles/udfs#tdfirst
 

アクセスログからセッション単位にサマリした際の一番最初(time値が一番小さい)のリファラとURLを取得しています。
つまり、流入元(リファラ)とランディングページ(進入ページ)が取得できます。

TD_LAST

公式ドキュメント: https://docs.treasuredata.com/articles/udfs#tdlast
 

TD_FIRSTの逆です。
今回の場合はセッションの最後にアクセスしたページ、つまり離脱ページを取得することができます。

parse_url

公式ドキュメント: https://docs.treasuredata.com/articles/hive-functions
 

TDのUDFではなくhiveの関数です。
URLをパースしてホスト名やパス、指定したクエリパラメータの値を取得することができます。
これを使うことで、GoogleAnalyticsのパラメータを取得することができます。

最後にひとこと

実際の作業でよく使うHiveQLのクエリとUDFについて紹介させていただきました!

私自身、まだまだ知らないUDFもあり日々勉強しております。また次回、実例と一緒に学んだことを投稿できればと思います。

以上、TreasureDataでWEBログ分析をしてみたでした!


DACエンジニア採用情報

  関連記事

【入門編】TreasureDataでサイトのアクセス解析をしてみた~第2弾!~

今回もやります、集計クエリ解説シリーズ第2弾!! 前回は、Webログからセッション単位のデータを作成するだけでした。 第2弾では作成したテーブルを元に、より実践的なアクセス解析、サイト分析で使えるHiveQLについて、実際に使用したクエリとともに解説していきたいと思います。 今回やったこと 利用した …

巨大データベースのスケールアップと引越作業

はじめに ビッグデータ解析部でオーディエンスデータ解析基盤の開発、運用を担当している Mike です。 弊社ではインターネット広告配信ログをはじめとする「ビッグデータ」と呼ぶにふさわしいデータボリュームを扱うオーディエンスデータ解析基盤を構築しています。今秋、そのうちの1構成要素である、データサイズ …

HivemallでMinhash!〜似てる記事を探し出そう。〜

こんにちは。俺やで。 前回の投稿に続き(間が空きましたが)、 ビッグデータに対応したHiveで使える機械学習ライブラリ、 「Hivemall」の使い方、第2弾となります。 今回はMinhashという手法について書きたいと思います。 ※前回 【超入門】Hivemallで機械学習 〜Treasure D …

Amazon ElastiCache/Redisのパフォーマンス確認

はじめに こんにちは、AudienceOne開発部です。AudienceOne開発部ではいわゆるビッグデータと呼ばれる大量のデータをアドホックあるいは定常的に日々ETLだの集合演算だのをする一方で、様々な大規模データ処理ソリューションを継続的に検証しております。 本記事は、その中でもユーザが保持して …

Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

HyperLoglogでcount distinctを速くする

こんにちは。俺やで。 HyperLoglogについて書きます。おもしろいです。名前が。 ■1. HyperLoglogとは? count distinctを速くするアルゴリズム 以前、Minhashについて書きました。 (Treasure Dataさんのブログにも載せていただきました。ありがとうござ …

no image
いま必要なのは「アナリティクスアプローチ」

こんにちは。 ビッグデータ解析部のakiです。 解析部で、Markezineでの連載をはじめましたのでご紹介です。 いま必要なのは「アナリティクスアプローチ」、ビッグデータ活用の課題とこれから (http://markezine.jp/article/detail/21293) マーケターのかた向け …

【超入門】Hivemallで機械学習 〜Treasure Dataでロジスティック回帰編〜

こんにちは。俺やで。 ビッグデータとかデータサイエンティストとかいう言葉が未だブームですね。 (「データサイエンティスト」は下火か。) ビッグデータ扱えるエンジニアも、 統計解析ができるアナリストも、 どっちもできるスーパーマンも世の中にはたくさんいますが、 ビッグデータも統計解析も扱えるインフラは …

ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

【Hivemall入門】RandomForestで毒キノコ推定モデルを作る

こんにちは。俺やで。 今回も前回から間が空いてしましたが、ビッグデータに対応したHiveで使える機械学習ライブラリ、 Hivemallの使い方について、書かせていただければと思います。 なお今回はQiitaのTreasure Data / Advent Calender 2015の12/3日分として …