Hadoop 相互间隔1分钟内发生的清管器重复数据消除事件

Hadoop 相互间隔1分钟内发生的清管器重复数据消除事件,hadoop,mapreduce,apache-pig,Hadoop,Mapreduce,Apache Pig,我们将pig-0.11.0-cdh4.3.0与cdh4集群一起使用,我们需要消除一些web日志的重复。解决方案思想(用SQL表示)如下: SELECT T1.browser, T1.click_type, T1.referrer, T1.datetime, T2.datetime FROM My_Table T1 INNER JOIN My_Table T2 ON T2.browser = T1.browser AND

我们将pig-0.11.0-cdh4.3.0与cdh4集群一起使用,我们需要消除一些web日志的重复。解决方案思想(用SQL表示)如下:

SELECT
     T1.browser,
     T1.click_type,
     T1.referrer,
     T1.datetime,
     T2.datetime
FROM
     My_Table T1
INNER JOIN My_Table T2 ON
     T2.browser = T1.browser AND
     T2.click_type = T1.click_type AND
     T2.referrrer = T1.referrer AND
     T2.datetime > T1.datetime AND
     T2.datetime <= DATEADD(mi, 1, T1.datetime)
选择
T1.1浏览器,
T1.单击“”类型,
T1.推荐人,
T1.datetime,
T2.datetime
从…起
我的表T1
内部连接My_表T2 ON
T2.browser=T1.browser和
T2.单击类型=T1.单击类型并
T2.referrer=T1.referrer和
T2.datetime>T1.datetime和

T2.datetime从我的头顶上看,像这样的东西可以工作,但需要测试:

view = FOREACH input GENERATE browser, click_type, referrer, datetime, GetYear(datetime) as year, GetMonth(datetime) as month, GetDay(datetime) as day, GetHour(datetime) as hour, GetMinute(datetime) as minute;
grp = GROUP view BY (browser, click_type, referrer, year, month, day, hour, minute);
uniq = FOREACH grp {
    top = LIMIT view 1;
    GENERATE FLATTEN(view.(browser, click_type, referrer, datetime))
}
当然,如果一个事件发生在12:03:45,另一个事件发生在12:03:59,那么它们将属于同一组,而12:04:45和12:05:00将属于不同的组


要获得准确的60秒差异,您需要编写一个UDF,该UDF将在分组的分拣行李上进行迭代(浏览器,单击“类型”,参照者),并删除不需要的行。

一种方法是,您可以通过所需的参数来完成此分组

         top3 = foreach grpd {
            sorted = filter records by time < 60;
            top    = limit sorted 2;
            generate group, flatten(top);
         };
top3=foreach grpd{
排序=按时间<60筛选记录;
top=排序为2的限制;
生成组,展平(顶部);
};

这将是另一种方法

   records_group = group records by (browser, click_type, referrer);

   with_min = FOREACH records_group 
   GENERATE
   FLATTEN(records), MAX(records.datetime) as maxDt ;

  filterRecords = filter with_min by (maxDt - $2 ) <60;

records\u group=按分组记录(浏览器,单击\u type,referer);
带\u min=FOREACH记录\u组
生成
展平(记录),最大(记录.日期时间)为maxDt;
filterRecords=通过(maxDt-$2)Aleks和Marq进行过滤

  records_group = group records by (browser, click_type, referrer);

  with_min = FOREACH records_group 
           GENERATE FLATTEN(records), MAX(records.datetime) as max 

  with_min = FOREACH with_min GENERATE browser, click_type, referrer, 
            ABS(max - dateime) as maxDtgroup;

  regroup = group with_min by (browser, click_type, referrer, maxDtgroup);

使用maxDtGroup键重新分组,并过滤前1条记录

您使用的是哪个版本的pig?数据时间的格式是什么?您能提供一些例子吗?我们正在使用pig-0.11.0-cdh4.3.0和cdh4集群。关于日期格式,我已经有了解析日志并将日期(使用ToDate函数)提取为DateTime值的代码。关于关系模式,假设元组有:browser、refererrer、click_type和datetime,有时同一浏览器中有DUP,在1分钟的时差内单击“键入和引用”。即使两个事件之间的时差小于60秒,您是否愿意每分钟有一条唯一的记录?如果我理解正确,是的。这正是我要找的。更准确地说:我想保留2个中最新的,扔掉旧的。换言之:如果任何两个事件(在浏览器上匹配,单击类型和引用)彼此之间的间隔在60秒内,则过滤掉旧的事件并保留最近的事件。您将如何计算“按时间<60过滤记录”的“时间”?Marquez已经将日期(使用ToDate函数)提取为DateTime值。查找组的最长时间并进行差异并检查<60秒您如何准确地在同一行李的行之间进行差异?“filterRecords=filter with_min by(maxDt-$2)以及(browser,click_type,referrer,12:03:45)和(browser,click_type,referrer,12:04:50)等事件不重复,其中(browser,click_type,Referer,12:04:51)是重复的。每个组有一个maxDt不允许60秒的滑动窗口。抱歉,Aleks,我对你的第二点感到困惑。我希望OP需要过滤组中的所有记录(browser,click_type,Referer)事件时间<60秒。请参考sql OP是否也在尝试这样做,与MAX dt相比,它将在指定的时间限制内过滤所有记录。更准确地说:“我希望保留2个事件中最新的一个,并丢弃旧的一个。换句话说,如果有任何2个事件(在浏览器上匹配,请单击“键入并参考”)在SQL中“T2.datetime>T1.datetime和T2.datetime”records_group=grouprecords by(browser,click_type,referer);“不包含任何时间信息,因此组将包含可以相隔数小时的记录。MAX(records.datetime)将使用最新时间和“(maxDt-$2)