pig里面是有TOP函数,不知道为什么用不了。有时间要去看看pig源码了。

SET job.name 'top_k';

SET job.priority HIGH;

--REGISTER piggybank.jar;
REGISTER wizad-etl-udf-0.1.jar;

--DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader();
DEFINE SequenceFileLoader com.vpon.wizad.etl.pig.SequenceFileCSVLoader();

--%default cleanedLog /user/wizad/data/wizad/cleaned/2014-07-30/*/part*
%default cleanedLog /user/wizad/data/wizad/cleaned/$date/*/part*

%default output_path /user/wizad/tmp/hour_count

origin_cleaned_data = LOAD '$cleanedLog' USING SequenceFileLoader 
AS (ad_network_id:chararray,
    wizad_ad_id:chararray,
    guid:chararray,
    id:chararray,
    create_time:chararray,
    action_time:chararray,
    log_type:chararray, 
    ad_id:chararray,
    positioning_method:chararray,
    location_accuracy:chararray,
    lat:chararray, 
    lon:chararray,
    cell_id:chararray,
    lac:chararray,
    mcc:chararray,
    mnc:chararray,
    ip:chararray,
    connection_type:chararray,
    imei:chararray,
    android_id:chararray,
    android_advertising_id:chararray,
    udid:chararray,
    openudid:chararray,
    idfa:chararray,
    mac_address:chararray,
    uid:chararray,
    density:chararray,
    screen_height:chararray,
    screen_width:chararray,
    user_agent:chararray,
    app_id:chararray,
    app_category_id:chararray,
    device_model_id:chararray,
    carrier_id:chararray,
    os_id:chararray,
    device_type:chararray,
    os_version:chararray,
    country_region_id:chararray,
    province_region_id:chararray,
    city_region_id:chararray,
    ip_lat:chararray,
    ip_lon:chararray,
    quadkey:chararray);

show_log= FILTER origin_cleaned_data by log_type=='1';

--extract column for analyzing,提取子字段做为新属性
original_hour = FOREACH show_log GENERATE ad_network_id,wizad_ad_id,guid,app_category_id,log_type,SUBSTRING(create_time,11,13) AS hour;  --(wizad_ad_id,guid,log_type,hour)

hour_group = GROUP original_hour BY (hour,app_category_id);--按属性分类,

hour_count = foreach hour_group{
                                --guid_data = $1.guid;
                                --uniq_guid = distinct guid_data;--去重处理。查唯一个数。
                                ad_network_ids = original_hour.ad_network_id;

uniq_ad_network_ids = distinct ad_network_ids;

--统计每个包下的个数,将后面uniq_ad_network_ids分成单个记录。比如,uniq_ad_network_ids原值{3,5},现变成两条记录,分为(xx,3)(xx,5)两条记录

generate flatten(group), COUNT_STAR($1) AS pv, flatten(uniq_ad_network_ids);

}

describe hour_count;
--查看结构为:hour_count: {group::hour: chararray,group::app_category_id: chararray,pv: long,uniq_ad_network_ids::ad_network_id: chararray}

group_hour_count = group hour_count by (hour,ad_network_id);
top_2_data = foreach group_hour_count {
                        --top_dataset = TOP(2,hour_count.pv, hour_count);--top函数 不能用。有谁用过告诉一声,我就不用看源码拉,哈哈

--hour_data = hour_count;

--top k实现方式,order排序,limit返回前k个。

order_hour_count = order hour_count by pv DESC;

top2_hour_count = limit order_hour_count  2;

--generate group, top2_hour_count.pv, top2_hour_count.app_category_id;-- 注意,后面是两个bag,分开的。
                        generate flatten(top2_hour_count );
}

pig中查询top k,返回每个hour和ad_network_id下最大两个记录(SUBSTRING,order,COUNT_STAR,limit)相关推荐

  1. 海量数据中找top K专题

    1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...

  2. 如何解决ACCESS中select TOP语句返回全部记录问题?(转)

    原文: http://www.tinyu.net/blog/blogview.asp?logID=470 如果在查询TOP语句的后面使用Order  by ,而且Order by字段中有重复值的话,那 ...

  3. 《剑指offer》-- 链表中倒数第k个节点、反转链表、合并两个排序的链表

    一.链表中倒数时第k个节点: 1.题目: 输入一个链表,输出该链表中倒数第k个结点. 2.解题思路:单链表具有单向移动的特性. (1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第c ...

  4. mysql resulttype_常见的MyBatis中查询结果resultType返回值类型

    一.返回一般数据类型 比如要根据 id 属性获得数据库中的某个字段值. mapper (dao)接口: // 根据 id 获得数据库中的 username 字段的值 String getStuName ...

  5. oracle查询保留小数点后三位,关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)...

    方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999999999999999.00') as amount 不足之处是,如果数值是0的话 ...

  6. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)

    海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 版权声明:本文为博主原创文章,未经博主允许不得转载 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望 ...

  7. 海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)

    一.问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的) ...

  8. 10亿个数中找出最大的10000个数之top K问题

    方法一.先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10 ...

  9. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    top K问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最热 ...

最新文章

  1. Yii 框架学习--03 多应用多模块
  2. 【Linux】一步一步学Linux——reboot命令(197)
  3. springmvc返回jsp源代码解决办法
  4. java md5方法 for Android
  5. 直接使用临时变量导致的一个bug记录
  6. 安卓电视 TV端的webview网页 按键控制和一些小问题
  7. 夜间灯光数据arcgis处理_基于夜间灯光数据与Landsat数据
  8. 一个Python开源项目-哈勃沙箱源码剖析(下)
  9. 【硬件木马项目】第二篇:硬件木马检测方法的种类及原理
  10. 详解JavaScript函数式编程中的curry函数
  11. QT将英文星期转为中文星期
  12. Iptables详解七层过滤
  13. 28岁想入行软件测试,可行吗?
  14. AI for Science年度激辩:AlphaFold成功难以复制,数据人才生态建设都是挑战|MEET2023...
  15. Android 连接 TSC打印机, 打印标签(文字、图片)
  16. 如何对人脸识别进行法律规制
  17. php获取QQ音乐直链,微信小程序-获取QQ音乐直链
  18. (C语言)输入一行字符,将此字符串中最长的单词输出。
  19. 拆解闲鱼无货源盈利模式,需要注意的细节太多?
  20. 服务器系统能玩吃鸡么,迅游普通vip能吃鸡能玩什么服务器 | 手游网游页游攻略大全...

热门文章

  1. 思普瑞特,小票打印机和标签打印机java网络驱动设计与实现
  2. 安卓Edge浏览器的一些用法
  3. 10. solt 插槽
  4. 用热键win+字母激活任务栏上的按钮[ahk]
  5. JProfiler远程监控
  6. 一文跟我玩转lvgl Gui guider
  7. ubuntu18.04 安装五笔拼音
  8. 科幻变现实:喷下即疗愈,生物3D打印绘就生命密码图
  9. 网上招标系统的设计与实现
  10. 保姆级SLS日志服务使用总结