2012-05-12 6 views
6

Supongamos que el seguimiento de un 'evento' un usuario adquiere un sitio web, los eventos pueden ser cosas como:cálculo del análisis de embudo, ¿cómo calcularía un embudo?

  1. página consultados
  2. elemento añadido a la cesta
  3. la caja
  4. pagado por fin

Ahora cada uno de esos eventos se almacenan en una base de datos como:

session_id event_name created_date ..

Así que ahora quieren construir un informe para mostrar un embudo particular que voy a definir como:

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

Así que este embudo en particular tiene 3 pasos, y cada paso se asocia con cualquier evento .

¿Cómo puedo crear un informe para esto ahora dados los datos anteriores que tengo?

Nota: quiero ser claro, quiero poder crear cualquier embudo que defina, y ser capaz de crear un informe para él.

La forma más básica que se me ocurre es:

  1. obtener todos los eventos para cada paso que tengo en mi base de datos
  2. el paso # 1 será, x% de las personas realiza event_n
  3. ahora voy a tener que consultar los datos para el paso # 2, que también se realiza el paso # 1, y mostrar el%
  4. Igual que el # 3, pero para el paso # 3, con la condición para el paso # 2

Tengo curiosidad de cómo estos servicios en línea pueden mostrar este tipo de informes en un entorno alojado de Saas. ¿Map-reduce hace que esto sea más fácil de alguna manera?

+0

Bueno, puede obtener todos los eventos por ID de sesión en un reductor si cree que esto lo hace más fácil. –

Respuesta

2

El problema central en la forma en que está pensando en esto es que está pensando en un modelo de tipo SQL/tabla. Cada evento es un registro. Una de las cosas buenas de las tecnologías NoSQL (para las cuales sientes una idea) es que puedes almacenar el registro de forma natural como una sesión por registro. Una vez que almacene los datos de una manera basada en la sesión, puede escribir una rutina que verifique si esa sesión cumple con el patrón o no. No es necesario hacer uniones ni nada, solo un ciclo sobre una lista de transacciones en una sesión. Tal es el poder de los datos semiestructurados.

¿Qué sucede si almacena sus sesiones juntas? Entonces, todo lo que tienes que hacer es iterar a través de cada sesión y ver si coincide.

Este es un caso de uso fantástico para HBase, en mi opinión.

Con HBase, usted almacena la ID de la sesión como la clave de la fila, luego cada uno de los eventos como valores con la marca de tiempo como el calificador de la columna. Lo que esto te deja es datos que están agrupados por ID de sesión, y luego ordenados por tiempo.

Bien, entonces ahora quiere saber qué porcentaje de sesiones ejecutó el comportamiento 1, luego 2 y luego 3. Ejecuta un trabajo de MapReduce sobre estos datos.El trabajo de MapReduce le proporcionará una sesión por par clave/valor de fila. Escribe un ciclo sobre los datos para verificar si coincide con el patrón. Si cuenta +1, si no, no.


Sin salir todo con HBase, puede utilizar MapReduce para sesionizar sus datos desorganizados en reposo. Agrupe por el ID de sesión, luego en el reductor tendrá todos los eventos asociados con esa sesión agrupados. Ahora, básicamente estás donde estuviste con HBase, donde puedes escribir un método en el reductor que verifica el patrón.


HBase puede ser exagerado si no tiene una cantidad ridícula de datos. Cualquier tipo de base de datos que pueda almacenar datos jerárquicamente será bueno en esta situación. MongoDB, Cassandra, Redis vienen a la mente y tienen sus fortalezas y debilidades.

+0

No estoy seguro de si era claro o no, pero lo que quiero es que los usuarios puedan definir un embudo (los pasos y eventos coincidentes por paso) y poder ver informes sobre datos históricos. Supongo que esto significa que tendré que ejecutar trabajos por lotes para extraer datos antiguos en la estructura/almacén de datos determinado ¿verdad? no hay una forma mágica alrededor de este derecho? – Blankman

+0

Estaba leyendo en hbase, y me gusta cómo podría haber almacenado datos relacionados de forma agrupada, etc. ¿Cómo podría hacer algo similar con mongodb? (hbase puede ser demasiado para mí en este momento) – Blankman

+0

Sí, tendrás que escribir algún tipo de proceso para unirlos o si estás usando un data store que almacena datos como ese, puedes simplemente modificar los registros. Si está haciendo usuarios, no sesiones, simplemente agrupe por los usuarios en lugar de la identificación de la sesión. –

7

En primer lugar la respuesta, utilizando SQL estándar, dado que su hipótesis: hay una mesa de eventos con un diseño simple:

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

Para obtener la sesión que se lleva a cabo el paso # 1 en algún momento:

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

Aquí hago la suposición de que event1 puede ocurrir más de una vez por sesión. El resultado es una lista de sesión única que demostró event1 en algún momento.

Con el fin de conseguir el paso 2 y paso 3, sólo puede hacer lo mismo:

-- 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; 

Ahora, desea seleccionar las sesiones que realizan el paso 1, paso 2 y paso 3 - en ese orden. Más precisamente, necesita contar las sesiones que realizaron el paso 1, luego contar la sesión que realizó el paso 2, luego contar las sesiones que realizaron el paso 3. Básicamente sólo tenemos que combinar los 3 anteriores consultas con izquierda unirse a la lista de las sesiones que entraron en el embudo y qué pasos se realizan:

-- 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 

El resultado es una lista de sesión única que entró en el embudo en el paso 1, y puede haber seguido el paso 2 y paso 3 ... ej:

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

Ahora sólo tenemos que calcular algunas estadísticas, por ejemplo:

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 

Et voilà!

Ahora para la discusión. En primer lugar, el resultado es bastante directo, dado que adopta el modo de pensar "establecido" (o funcional) y no el enfoque "procedimental". No visualices la base de datos como una colección de tablas fijas con columnas y filas ... así es como se implementa, pero no es la forma en que interactúas con ella. ¡Son todos sets, y puedes organizar los sets de la forma que necesites!

Segundo punto que la consulta se optimizará automáticamente para ejecutarse en paralelo si está utilizando una base de datos MPP, por ejemplo. Ni siquiera necesita programar la consulta de manera diferente, usar map-reduce o lo que sea ... Ejecuté la misma consulta en el conjunto de datos de prueba con más de 100 millones de eventos y obtuve resultados en segundos.

Por último, pero no menos importante, la consulta abre un sinfín de posibilidades.¡Agrupe los resultados por el receptor, las palabras clave, la página de destino, la información del usuario y analice cuál proporciona la mejor tasa de conversión, por ejemplo!

+0

Creo que esta consulta podría tener un problema, por ejemplo, si quiero saber quién lo hizo: E1, E2, E3 y yo tenemos una sesión con E2, E1, E2, E3. Creo que la consulta anterior fallará (ya que solo considera el primera aparición de un evento) – shaylevi2

+0

En realidad, no. La única restricción en la consulta inicial es que E1 E2 => E3, pero eso requerirá contar el evento en una sesión primero (que se puede hacer fácilmente con una función de ventana, por ejemplo) – SergeFantino

0

que recientemente lanzó una fuente abierta Colmena UDF para hacer esto: hive-funnel-udf

Es bastante sencillo de utilizar para este tipo de tarea de análisis de embudo, sólo puede escribir de la colmena, sin necesidad de escribir código Java personalizado MapReduce.

Esto solo funcionará si está usando Hive/Hadoop para almacenar y consultar sus datos.

+2

No publique [respuestas duplicadas] (// meta.stackexchange.com/a/211726/206345). En su lugar, considere otras acciones que podrían ayudar a los futuros usuarios a encontrar la respuesta que necesitan, como se describe en la publicación vinculada. – Mogsdad

Cuestiones relacionadas