6

ユーザーがウェブサイトで取る「イベント」を追跡するとします。イベントは次のようになります。

  1. 閲覧したホームページ
  2. カートにアイテムを追加しました
  3. チェックアウト
  4. 注文の支払い

これで、これらの各イベントは次のようなデータベースに保存されます。

session_idevent_namecreated_date.。

そこで、次のように定義する特定の目標到達プロセスを表示するレポートを作成します。

Step#1   event_n
Step#2   event_n2
Step#3   event_n3

したがって、この特定の目標到達プロセスには3つのステップがあり、各ステップは任意のイベントに関連付けられています。

上記のデータを使用して、このレポートを作成するにはどうすればよいですか?

注:明確にしておきたいのは、自分で定義したファネルを作成し、そのレポートを作成できるようにすることです。

私が考えることができる最も基本的な方法は次のとおりです。

  1. データベースにある各ステップのすべてのイベントを取得します
  2. ステップ#1は、x%の人がevent_nを実行します
  3. 次に、ステップ#1も実行したステップ#2のデータをクエリし、%を表示する必要があります。
  4. #3と同じですが、ステップ#2の条件でステップ#3の場合

これらのオンラインサービスが、ホストされたSaas環境でこれらのタイプのレポートをどのように表示できるのか興味があります。map-reduceはこれをどういうわけか簡単にしますか?

4

3 に答える 3

7

最初の答えは、標準 SQL を使用して、仮説を考えた場合です。単純なレイアウトのテーブル EVENTS があります。

EVENTS
-----------------------------
SESION_ID , EVENT_NAME , TMST

ある時点でステップ 1 を実行したセッションを取得するには:

-- QUERY 1
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID;

ここでは、event1 がセッションごとに複数回発生する可能性があると想定しています。結果は、ある時点で event1 を示した一意のセッションのリストです。

step2 と step3 を取得するには、同じことを行うだけです。

-- QUERY 2
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID;
-- QUERY 3
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event3' GROUP BY SESSION_ID;

ここで、ステップ 1、ステップ 2、およびステップ 3 をこの順序で実行したセッションを選択します。より正確には、ステップ 1 を実行したセッションをカウントし、次にステップ 2 を実行したセッションをカウントし、次にステップ 3 を実行したセッションをカウントする必要があります。基本的には、上記の 3 つのクエリを left join と組み合わせて、目標到達プロセスに入ったセッションと、それらが実行したステップを一覧表示するだけです。

-- FUNNEL FOR S1/S2/S3
SELECT 
  SESSION_ID, 
  Q1.TMST IS NOT NULL AS PERFORMED_STEP1,
  Q2.TMST IS NOT NULL AS PERFORMED_STEP2,
  Q3.TMST IS NOT NULL AS PERFORMED_STEP3
FROM
  -- QUERY 1
  (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID) AS Q1,
LEFT JOIN
  -- QUERY 2
  (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q2,
LEFT JOIN
  -- QUERY 3
  (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q3
-- Q2 & Q3
ON Q2.SESSION_ID=Q3.SESSION_ID AND Q2.TMST<Q3.TMST
-- Q1 & Q2
ON Q1.SESSION_ID=Q2.SESSION_ID AND Q1.TMST<Q2.TMST

結果は、ステップ 1 で目標到達プロセスに入り、ステップ 2 とステップ 3 に続いた可能性がある一意のセッションのリストです... 例:

SESSION_ID_1,TRUE,TRUE,TRUE
SESSION_ID_2,TRUE,TRUE,FALSE
SESSION_ID_3,TRUE,FALSE,FALSE
...

次に、いくつかの統計を計算する必要があります。たとえば、次のようになります。

SELECT
  STEP1_COUNT,
  STEP1_COUNT-STEP2_COUNT AS EXIT_AFTER_STEP1,
  STEP2_COUNT*100.0/STEP1_COUNT AS PERCENTAGE_TO_STEP2,
  STEP2_COUNT-STEP3_COUNT AS EXIT_AFTER_STEP2,
  STEP3_COUNT*100.0/STEP2_COUNT AS PERCENTAGE_TO_STEP3,
  STEP3_COUNT*100.0/STEP1_COUNT AS COMPLETION_RATE
FROM
(-- QUERY TO COUNT session at each step
  SELECT
    SUM(CASE WHEN PERFORMED_STEP1 THEN 1 ELSE 0 END) AS STEP1_COUNT,
    SUM(CASE WHEN PERFORMED_STEP2 THEN 1 ELSE 0 END) AS STEP2_COUNT,
    SUM(CASE WHEN PERFORMED_STEP3 THEN 1 ELSE 0 END) AS STEP3_COUNT
  FROM
    [... insert the funnel query here ...]
) AS COMPUTE_STEPS

ほら!

では、議論を始めましょう。最初のポイントは、「手続き型」アプローチではなく、「セット」(または関数型) の考え方を採用すれば、結果は非常に簡単です。データベースを列と行を持つ固定テーブルのコレクションとして視覚化しないでください...これは実装方法ですが、それを操作する方法ではありません。全てセットになっているので、好きなようにアレンジできます!

たとえばMPPデータベースを使用している場合、クエリが自動的に最適化されて並列実行されるという2番目のポイント。map-reduce などを使用して、クエリを別の方法でプログラムする必要さえありません... 1 億を超えるイベントを含むテスト データセットで同じクエリを実行し、数秒で結果を取得しました。

最後になりましたが、クエリによって無限の可能性が開かれます。リファラー、キーワード、ランディング ページ、ユーザー情報で結果をグループ化し、たとえばどれが最高のコンバージョン率を提供するかを分析します!

于 2013-12-04T11:12:18.080 に答える
2

これについて考えている方法の中心的な問題は、SQL/テーブル型モデルで考えていることです。各イベントは 1 つのレコードです。NoSQL テクノロジの優れた点の 1 つは (あなたが感じていることです)、レコードをレコードごとに 1 つのセッションとして自然に保存できることです。セッションベースの方法でデータを保存したら、そのセッションがパターンに準拠しているかどうかを確認するルーチンを作成できます。結合などを行う必要はなく、セッション内のトランザクションのリストをループするだけです。これが半構造化データの威力です。

セッションを一緒に保存するとどうなりますか? あとは、各セッションを反復処理して、一致するかどうかを確認するだけです。

私の意見では、これは HBase の素晴らしい使用例です。

HBase では、セッション ID を行キーとして保存し、各イベントをタイム スタンプを列修飾子として値として保存します。これにより、セッション ID でグループ化され、時間で並べ替えられたデータが残ります。

では、セッションの何パーセントが動作 1、2、3 を実行したかを把握したいと思います。このデータに対して MapReduce ジョブを実行します。MapReduce ジョブは、行のキーと値のペアごとに 1 つのセッションを提供します。データにループを書き込んで、パターンに一致するかどうかを確認します。カウントする場合は + 1、カウントしない場合はカウントしません。


HBase を全面的に使用しなくても、MapReduce を使用して、整理されていない保存データをセッション化できます。セッション ID でグループ化すると、リデューサーで、そのセッションに関連付けられたすべてのイベントがグループ化されます。これで、基本的に HBase を使用していた場所に戻り、パターンをチェックするレデューサーにメソッドを記述できます。


途方もない量のデータがない場合、HBase はやり過ぎかもしれません。この状況では、データを階層的に格納できるあらゆる種類のデータベースが適しています。MongoDB、Cassandra、Redis はすべて頭に浮かび、それぞれに長所と短所があります。

于 2012-05-13T04:54:42.797 に答える
1

私は最近、これを行うためのオープンソースの Hive UDF をリリースしました: hive-funnel-udf

この種のファネル分析タスクに使用するのは非常に簡単です。カスタム Java MapReduce コードを記述する必要はなく、Hive を記述するだけです。

ただし、これは、Hive/Hadoop を使用してデータを保存およびクエリしている場合にのみ機能します。

于 2016-05-16T22:14:23.030 に答える