foreach内部处理数据流的每条记录,进行关系操作,最后用generate返回数据给外部。但注意关系操作符不能作用于表达式,要将表达式提取成关系。

foreach内部只支持distinctfilterlimitorder;最后必须是generate;

foreach内部处理数据每次处理一条。对group后的关系(流对象),foreach内嵌每次传入一个group子集。

所以foreach内嵌之前都是先group关系,

也就是说,group后的数据,一次传进来一个group子集,可以分别按每个group进行统计等操作。(证明在最后。)

如统计每个exchange对应的symbol数:

--distinct_symbols.pig

daily   = load 'NYSE_daily' as (exchange, symbol); -- not interested in otherfields

grpd    = group daily by exchange;

uniqcnt = foreach grpd {

sym      = daily.symbol;

uniq_sym = distinct sym;

generate group, COUNT(uniq_sym);

};

Foreach分别提取grpd的每个group,表达式变关系,被关系操作符处理。

 

 

使用forecah内嵌,去重的两个例子

,分别统计两列的唯一数:group内提取两个子集,分别去重,统计

--double_distinct.pig

divs = load 'NYSE_dividends' as(exchange:chararray, symbol:chararray);

grpd = group divs all;

uniq = foreach grpd {

exchanges      =divs.exchange;--this 'divs' is the $1 colum

uniq_exchanges = distinct exchanges;

symbols        = divs.symbol;

uniq_symbols   = distinct symbols;

generate COUNT(uniq_exchanges), COUNT(uniq_symbols);

};

 

另一种用limit返回1一条:日志数据通过hour分组,统计cookie:

(1)   首先对(hour,cookie)按照cookie进行去重;

(2)   按hour分组;

(3)   hour分组进行局部count

(4)   合并各个count,得到最终结果

下面是具体代码示例:

showlogs= LOAD '$inpath' USING PigStorage(',');

necessaryfields= FOREACH showlogs GENERATE (chararray)$1 AS fhour,$13 AS fallyesid, $19 ASfip, $20 AS fuseragent , CONCAT((chararray)$19,(chararray)$20) AS fipuseragent;

--1.生成hour+cookie : hourcookie

hourcookie= FOREACH necessaryfields GENERATE $0 AS hour, $1 AS cookie;

--2.对hourcookie按照cookie进行去重:
dist_hour_cookie

ta= GROUP hourcookie BY cookie;

dist_hour_cookie= FOREACH ta {

temp = limit hourcookie 1;

GENERATE FLATTEN(temp);

};

--3.对dist_hour_cookie按照hour进行分组:dist_hour_cookie_grp

dist_hour_cookie_grp= GROUP dist_hour_cookie BY $0;

--4.对dist_hour_cookie_grp进行count:dist_hour_cookie_grp_count

dist_hour_cookie_grp_count= FOREACH dist_hour_cookie_grp {

GENERATE group AS hour, COUNT(dist_hour_cookie) AS cookie_count;

};

--5.对dist_hour_cookie_grp_count进行sum

sumtemp= GROUP  dist_hour_cookie_grp_count all;

total_cookie= FOREACH sumtemp GENERATE SUM(dist_hour_cookie_grp_count.cookie_count);

dump total_cookie;

 

针对foreach内嵌,每次处理一条数据。我做了一个实例测试,证明关系group后,foreach每次处理一个group子集。

数据按guid分组,每个记录都是一个独立的group。

去重统计个数,

在foreach最后输出guid和group,做对比,看到重复数据:

my_data = foreach origin_cleaned_data generate wizad_ad_id,guid,os_version,log_type;

test_data = limit my_data 100;

g_log = group test_data by guid;

uniq = foreach g_log{

        guid = test_data.guid;

        os_v = test_data.os_version;

        uniq_guid = distinct guid;

        generate group,COUNT(uniq_guid),COUNT(os_v),guid;

        };

dump uniq;

describe uniq;





结果

g_log结构: {group: chararray,test_data: {wizad_ad_id: chararray,guid: chararray,os_version: chararray,log_type: chararray}}

输出结果:

(351794060670802,1,1,{(351794060670802)})

(352246063893286,1,1,{(352246063893286)})

(352274018390729,1,1,{(352274018390729)})

(352315053649659,1,1,{(352315053649659)})

......

(354710052256050,1,1,{(354710052256050)})

(355065053261297,1,1,{(355065053261297)})

(861202021584958,1,1,{(861202021584958)})

(861276027634215,1,1,{(861276027634215)})

(861288000290493,1,1,{(861288000290493)})

(861372020081247,1,3,{(861372020081247),(861372020081247),(861372020081247)})

(862011024062881,1,1,{(862011024062881)})

(862040020713619,1,1,{(862040020713619)})

(862055100027987,1,1,{(862055100027987)})

(862106010206458,1,1,{(862106010206458)})

(862191016593489,1,1,{(862191016593489)})

(862283020830914,1,1,{(862283020830914)})

(862324016545965,1,2,{(862324016545965),(862324016545965)})

(862565010397387,1,1,{(862565010397387)})

(862620028211136,1,1,{(862620028211136)})

(862663027090333,1,1,{(862663027090333)})

(862703020059792,1,1,{(862703020059792)})

(862910026533684,1,1,{(862910026533684)})

(862966020482112,1,1,{(862966020482112)})

(863077025294442,1,1,{(863077025294442)})

(863139026459463,1,1,{(863139026459463)})

......

uniq: {group: chararray,long,long,guid: {guid: chararray}}





从中看出:

按guid分组所以前后,group和guid基本一致,但因为guid有重复,所以多了几条;

可如果使用uniq_guid,即generate group,COUNT(uniq_guid),COUNT(os_v),uniq_guid;那么前后将完全一致。





对比,在generate中去掉group和guid,即generate group,COUNT(uniq_guid),COUNT(os_v),guid;

输出结果:

(1,1)

(1,1)

(1,1)

(1,1)

(1,1)

.......





如果按log_type分组,2为click,1为show日志,

只limit 100的话,只有1的日志,

g_log = group test_data by log_type;

uniq = foreach g_log{

        guid = test_data.guid;

        os_v = test_data.os_version; 

        uniq_guid = distinct guid;

        generate COUNT(uniq_guid),COUNT(os_v),guid;

        };

结构为

uniq: {long,long,guid: {guid: chararray}}

(97,100,{(351794060670802),(352246063893286),(352274018390729),(352315053649659),(352316055186377),(352903052496931),(352956061574924),(353721059706006),(354710052256050),(355065053261297),(355310044316523),(355431800349753),(355594050655870),(355868054005229),(356405053894342),(356521051392830),(356524057953100),(356845052409198),(356988053301574),(357070009612856),(357116040052477),(357747051110463),(357784057979674),(358197058147473),(358373048304967),(358585052003587),(358968041526969),(359092058109426),(359357054529855),(359786051477264),(359899046896710),(860173013415348),(860570023370282),(860602020630317),(860813022906346),(860892020832126),(861022007037726),(861060010353755),(861118000103844),(861133029749824),(861202021584958),(861276027634215),(861288000290493),(861372020081247),(861372020081247),(861372020081247),(862011024062881),(862040020713619),(862055100027987),(862106010206458),(862191016593489),(862283020830914),(862324016545965),(862324016545965),(862565010397387),(862620028211136),(862663027090333),(862703020059792),(862910026533684),(862966020482112),(863077025294442),(863139026459463),(863150020224084),(863151028063706),(863177029375831),(863235016133314),(863343023501554),(863427022570130),(863431020260215),(863735010063193),(863777020966957),(863827011094952),(864260024902038),(864264021430787),(864264021548489),(864299028966482),(864301029532170),(864375022648902),(864500025549803),(864505000231848),(864573012942174),(864789028603903),(864958020327031),(864989010679594),(865030012667169),(865316020164285),(865369022512415),(865369029331074),(865407016261415),(866805010343957),(867064010125951),(867064016986521),(867163010209227),(867264010644205),(867739012450792),(868201005627091),(868629010372156),(868880017937570),(869226012126760),(869642009320895)})





 在generate COUNT(uniq_guid),COUNT(os_v),guid;中去掉guid的结果为:

(97,100)

uniq: {long,long}







另外,用sample可以按日志数据的整体分布取样,这样可以看到log_type的所有取值类型数据,

但是每次取样不一样,所以多次执行的统计结果不一样

my_data = foreach origin_cleaned_data generate wizad_ad_id,guid,os_version,log_type;

test_data = sample my_data 0.01;

g_log = group test_data by log_type;

uniq = foreach g_log{

        guid = test_data.guid;

        os_v = test_data.os_version;

        uniq_guid = distinct guid;

        generate group, COUNT(uniq_guid), COUNT(os_v);

        };







g_log结构为: {group: chararray,test_data: {wizad_ad_id: chararray,guid: chararray,os_version: chararray,log_type: chararray}}





生成的数据结果为

(1,13455,14246)

(2,74,74)

uniq: {group: chararray,long,long}





语句 generate中去掉group:generate COUNT(uniq_guid), COUNT(os_v)结果为

(13407,14178)

(73,73)

uniq: {long,long}

foreach 内嵌的使用的更多相关文章

  1. Makefile所有内嵌函数

    一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1       $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...

  2. Makefile学习(二)条件判断和内嵌函数

    第七章:Makefile的条件执行 条件语句可是是两个不同的变量.或者变量和常量值的比较: 7.1例子: 对变量“CC”进行判断,其值如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者 ...

  3. 操作 IoT 设备内嵌 SQLite

    Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD   Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本 ...

  4. 使用MailKit发送带有内嵌图片的邮件且图片不显示成附件

    使用MailKit发送带有内嵌图片的邮件且图片不显示成附件 参考文章:MailKit---发送邮件 注意 在邮件客户端中是否显示内嵌图片为附件依据不同邮件有所不同,暂经测试Outlook和qq不显示为 ...

  5. C#内嵌Python架构实现

    C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用. 比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不 ...

  6. 学习Tomcat(七)之Spring内嵌Tomcat

    前面的文章中,我们介绍了Tomcat容器的关键组件和类加载器,但是现在的J2EE开发中更多的是使用SpringBoot内嵌的Tomcat容器,而不是单独安装Tomcat应用.那么Spring是怎么和T ...

  7. .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

    一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文 ...

  8. Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

    Atitit java集成内嵌浏览器与外嵌浏览器attilax总结 HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟 ...

  9. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

随机推荐

  1. Linux上rpm实战搭建FTP服务器

    1.检测是否已安装FTP服务 # rpm -qa|grep vsftpd 2.未安装ftp服务的前提进行使用rpm安装 # yum install vsftpd -y Loaded plugins: ...

  2. RHEL(红帽七)的DNS配置

    RHEL7的DNS配置 本文中用到的所有参数均位于文末附录中   查询bind-chroot这个安装包 Yum 安装 bind-chroot 进入named.conf文件 复制以下参数进去 进入这个文 ...

  3. java求素数

    按定义 即除了1和它本身以外不再被其他的除数整数 public static void main(String[] args) { for (int i = 2; i < 100; i++) { ...

  4. JavaScript while 循环

    JavaScript while 循环的目的是为了反复执行语句或代码块. 只要指定条件为 true,循环就可以一直执行代码块. while 循环 while 循环会在指定条件为真时循环执行代码块. 语 ...

  5. Linux下的有用命令

    在之前的博客<Linux下常用命令与使用技巧>中,介绍了Linux的常用命令,在今天的博客中,给大家介绍其他的有用命令. 1.文本转换命令 在Linux下工作,我们不可避免地要和文件格式做 ...

  6. NLP系列(4)_朴素贝叶斯实战与进阶

    作者: 寒小阳 && 龙心尘 时间:2016年2月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50629608 htt ...

  7. 利用QrCode.Net生成二维码 asp.net mvc c#

    利用QrCode.Net生成二维码 asp.net mvc c# 里面介绍了.net的方式及js的方式,还不错. 里面用到的qrcode.net的类库下载地址:https://qrcodenet.co ...

  8. 微信小程序开发入门篇

    本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果. 开发准备工作 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的& ...

  9. PHP 针对多用户 实现头像更换

    成品图 思路 登陆页面 表单制作 验证码制作 JavaScript刷新验证码 验证页面 验证逻辑 页面跳转 header函数 Meta标签 JavaScript 上传页面 个人主页 上传核心 最终结果 ...

  10. PHP 验证码 浅析

    拓展 背景图 imagecreatetruecolor imagecolorallocate imagepng imagedestoryimage 简易数字验证码 imagecolorallocate ...