pig询问top k,每个返回hour和ad_network_id最大的两个记录(SUBSTRING,order,COUNT_STAR,limit)

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 );

}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-11 20:02:22

pig询问top k,每个返回hour和ad_network_id最大的两个记录(SUBSTRING,order,COUNT_STAR,limit)的相关文章

Top K问题!!!!!!!!!!!!!

转:http://blog.csdn.net/boo12355/article/details/11788655 Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.        假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查询串,要求使用的内存不能超过1G. 必备知识:什么

Top k问题(线性时间选择算法)

问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供了一种方法,可以在O(n)线性时间内解决Top k问题.关于时间复杂度的证明,不再解释,读者可以查阅相关资料.具体的算法描述如下: 算法:LinearSelect(S,k) 输入:数组S[1:n]和正整数k,其中1<=k<=n: 输出:S中第k小的元素 1. If  n<20  Then  

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

Top k 问题

Top K的问题: 给出大量数据,找出其中前K个最大(小)的数,或者在海量数据中找到出现频率最好的前K个数. 一.给出大量数据(N个),找出其中前K个最大数(没有其他资源上的限制) 1.使用排序算法 直接使用排序算法,如快速排序,然后遍历找到最大的K个数.时间复杂度为O(NlogN): 2.部分排序 因为,只要求出前K个最大值,所以我们不必全部排好.思路是:随意选出K个数形成一个数组,然后按从大到小进行排序,再从剩下的数中,选取一个数和数组中的最小值进行比较,若小于最小值,则取下一个数继续比较:

347. Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2,2,3] and k = 2, return [1,2]. Note: 347. Top K Frequent ElementsYou may assume k is always valid, 1 ≤ k ≤ number of unique elements. Your algorithm's

Top K Frequent Words

Given a list of words and an integer k, return the top k frequent words in the list. Given [ "yes", "lint", "code", "yes", "code", "baby", "you", "baby", "chrome", &

Spark 编程实战之经典算法TOP K

Top K Top K算法有两步,一是统计词频,二是找出词频最高的前K个词. 1.实例描述 假设取Top 1,则有如下输入和输出. 输入: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop 输出: 词Hadoop 词频4 2.设计思路 首先统计WordCount的词频,将数据转化为(词,词频)的数据对,第二个阶段采用分 治的思想,求出RDD每个分区的Top K,最后将每个分区的Top K结果合并以产生新的集

Top k问题的讨论(三种方法的java实现及适用范围)

在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围. 合并法 这种方法适用于几个数组有序的情况,来求Top k.时间复杂度为O(k*m).(m:为数组的个数).具体实现如下: /** * 已知几个递减有序的m个数组,求这几个数据前k大的数 *适合采用Merge的方法,时间复杂度(O(k*m); */ import java.util.List; import java.util.Arrays; import java.util.ArrayList; public

Top K and Quick Selection

The common solutions for top k problem are heap (priority queue) and quick selection. Using heap is very straight-forward, while quick selection with partition is more complicated and I didnot find any satisfying code online, so document as following