Bla*_*man 6 java math hadoop mapreduce bigdata
假设我跟踪用户在网站上进行的"事件",事件可以是:
现在,每个事件都存储在数据库中,如:
session_id event_name created_date ..
所以现在我想构建一个报告来显示我将定义的特定漏斗:
Step#1 event_n
Step#2 event_n2
Step#3 event_n3
Run Code Online (Sandbox Code Playgroud)
因此,这个特定的漏斗有3个步骤,每个步骤都与任何事件相关联.
鉴于我的上述数据,我现在如何为此建立报告?
注意:只是想清楚,我希望能够创建我定义的任何漏斗,并能够为它创建报告.
我能想到的最基本的方法是:
我很好奇这些在线服务如何在托管的Saas环境中显示这些类型的报告.map-reduce是否会以某种方式使这更容易?
小智 7
首先,使用标准SQL,给出您的假设:有一个简单布局的表EVENTS:
EVENTS
-----------------------------
SESION_ID , EVENT_NAME , TMST
Run Code Online (Sandbox Code Playgroud)
要在某个时间获得执行步骤#1的会话:
-- QUERY 1
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID;
Run Code Online (Sandbox Code Playgroud)
在这里,我假设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;
Run Code Online (Sandbox Code Playgroud)
现在,您要按顺序选择执行step1,step2和step3的会话.更准确地说,您需要计算执行步骤1的会话,然后计算执行步骤2的会话,然后计算执行步骤3的会话.基本上我们只需要将上面的3个查询与左连接组合在一起,列出进入漏斗的会话以及它们执行的步骤:
-- 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
Run Code Online (Sandbox Code Playgroud)
结果是在步骤1进入漏斗的唯一会话列表,可能已继续执行step2和step3 ...例如:
SESSION_ID_1,TRUE,TRUE,TRUE
SESSION_ID_2,TRUE,TRUE,FALSE
SESSION_ID_3,TRUE,FALSE,FALSE
...
Run Code Online (Sandbox Code Playgroud)
现在我们只需要计算一些统计数据,例如:
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
Run Code Online (Sandbox Code Playgroud)
Etvoilà!
现在进行讨论.第一点,考虑到你采用"集合"(或功能)思维方式而不是"程序化"方法,结果非常简单.不要将数据库可视化为具有列和行的固定表的集合......这是它的实现方式,但它不是您与它交互的方式.这是所有套装,您可以按照您需要的方式安排套装!
第二点,如果您使用MPP数据库,查询将自动优化为并行运行.您甚至不需要以不同方式编写查询,使用map-reduce或其他...我在我的测试数据集上运行了相同的查询,其中包含超过1亿个事件,并在几秒钟内获得结果.
最后但并非最不重要的是,查询打开了无限可能.只需按引用,关键字,登录页面,用户信息和分析的结果进行分组,例如提供最佳转换率!
您思考这个问题的方式的核心问题是您正在以 SQL/表类型模型进行思考。每个事件都是一个记录。NoSQL 技术的好处之一(您对此有所了解)是您可以自然地将记录存储为每条记录一个会话。以基于会话的方式存储数据后,您可以编写一个例程来检查该会话是否符合该模式。不需要进行连接或任何操作,只需循环会话中的事务列表即可。这就是半结构化数据的力量。
如果您将会话存储在一起怎么办?然后,您所要做的就是迭代每个会话并查看它是否匹配。
在我看来,这是 HBase 的一个绝佳用例。
使用 HBase,您可以将会话 ID 存储为行键,然后将每个事件存储为值,并以时间戳作为列限定符。这给您留下的是按会话 ID 分组在一起,然后按时间排序的数据。
好的,现在您想要计算出执行行为 1、然后是 2、然后是 3 的会话百分比是多少。您对此数据运行 MapReduce 作业。MapReduce 作业将为您提供每行键/值对一个会话。对数据编写一个循环以检查它是否与模式匹配。如果确实计数+1,如果没有,则不计数。
无需全力使用 HBase,您可以使用 MapReduce 来会话化静态的无组织数据。按会话 ID 分组,然后在化简器中,您将把与该会话关联的所有事件分组在一起。现在,您基本上已经完成了使用 HBase 的操作,您可以在减速器中编写一个方法来检查模式。
如果您没有大量的数据,HBase 可能会显得有些过分。在这种情况下,任何类型的能够分层存储数据的数据库都会很好。MongoDB、Cassandra、Redis 都有其优点和缺点。