我们有一大堆网络日志数据。我们需要对它进行会话化,并为每个会话生成上一个域和下一个域。我正在通过 AWS EMR 上的交互式作业流程进行测试。
现在,我可以在此处使用以下代码获取数据会话:http: //goo.gl/L52Wf。熟悉编译和使用 UDF 需要做一些工作,但我已经做到了。
这是输入文件的标题行和第一行(制表符分隔):
ID Date Rule code Project UID respondent_uid Type Tab ID URL domain URL path Duration Exit cause Details
11111111 2012-09-25T11:21:20.000Z 20120914_START_USTEST 20120914_TESTSITE_US_TR test6_EN_9 PAGE_VIEWED FF1348568479042 http://www.google.fr 11 OTHER
这是来自SESSIONS
关系的元组(获取关系的步骤如下所示):
(2012-09-27 04:42:20.000,11999603,20120914_URL_ALL,20120914_TESTSITE_US_TR,2082810875_US_9,PAGE_VIEWED,CH17,http://hotmail.com,_news/2012/09/26/14113684,28,WINDOW_DEACTIVATED,,3019222a-5c4d-4767-a82e-2b4df5d9db6d)
这大致就是我现在正在运行的测试数据会话:
register s3://TestBucket/Sessionize.jar
define Sessionize datafu.pig.sessions.Sessionize('30m');
A = load 's3://TestBucket/party2.gz' USING PigStorage() as (id: chararray, data_date: chararray, rule_code: chararray, project_uid: chararray, respondent_uid: chararray, type: chararray, tab_id: chararray, url_domain: chararray, url_path: chararray, duration: chararray, exit_cause: chararray, details: chararray);
B = foreach A generate $1, $0, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;
C = filter B by id neq 'ID';
VIEWS = group C by (respondent_uid, url_domain);
SESSIONS = foreach VIEWS { VISITS = order C by data_date; generate FLATTEN(Sessionize(VISITS)) as (data_date: chararray, id: chararray, rule_code: chararray, project_uid: chararray, respondent_uid: chararray, type: chararray, tab_id: chararray, url_domain: chararray, url_path: chararray, duration: chararray, exit_cause: chararray, details: chararray, session_id); }
(B处的步骤是将日期移动到第一个位置。C处的步骤是过滤掉文件头)
从这里开始,我迷失了正确的方向。
我可以迭代我与猪脚本的SESSIONS
关系foreach
并获取下一个和上一个域吗?编写自定义 UDF 并将SESSIONS
关系传递给它会更好吗?(编写我自己的 UDF 将是一次冒险!..)
任何建议将不胜感激。即使有人可以建议不要做的事情,也可能同样有帮助,所以我不会浪费时间研究垃圾方法。我对 Hadoop 和 pig 脚本还很陌生,所以这绝对不是我的强项之一(但..)。