使用Hive中自定義UDAF函式實現統計區域產品使用者訪問排名
UDAF實現方法:
1,使用者的UDAF必須繼承了org.apache.hadoop.hive.ql.exec.UDAF;
2,使用者的UDAF必須包含至少一個實現了org.apache.hadoop.hive.ql.exec的靜態類,諸如實現了 UDAFEvaluator
3,一個計算函式必須實現的5個方法的具體含義如下:
init():主要是負責初始化計算函式並且重設其內部狀態,一般就是重設其內部欄位。一般在靜態類中定義一個內部欄位來存放最終的結果。
iterate():每一次對一個新值進行聚集計算時候都會呼叫該方法,計算函式會根據聚集計算結果更新內部狀態。當輸 入值合法或者正確計算了,則 就返回true。
terminatePartial():Hive需要部分聚集結果的時候會呼叫該方法,必須要返回一個封裝了聚集計算當前狀態的物件。
merge():Hive進行合併一個部分聚集和另一個部分聚集的時候會呼叫該方法。
terminate():Hive最終聚集結果的時候就會呼叫該方法。計算函式需要把狀態作為一個值返回給使用者。
mapreduce階段呼叫函式
MAP
init()
iterate()
terminatePartial()
Combiner
merge()
terminatePartial()
REDUCE
init()
merge()
terminate()
一、自定義UDAF函式
點選(此處)摺疊或開啟
二、使用新增Jar包與Hive中臨時函式
點選(此處)摺疊或開啟
三、呼叫自定義UDAF函式處理資料
四、建立Hive臨時外部表
五、-統計最終區域前3產品排名
六、統計結果
此方法可能不會很好,但最少可以起到一定的拋磚引玉的功效。希望大家不吝賜教!
若澤大資料交流群:671914634
1,使用者的UDAF必須繼承了org.apache.hadoop.hive.ql.exec.UDAF;
2,使用者的UDAF必須包含至少一個實現了org.apache.hadoop.hive.ql.exec的靜態類,諸如實現了 UDAFEvaluator
3,一個計算函式必須實現的5個方法的具體含義如下:
init():主要是負責初始化計算函式並且重設其內部狀態,一般就是重設其內部欄位。一般在靜態類中定義一個內部欄位來存放最終的結果。
iterate():每一次對一個新值進行聚集計算時候都會呼叫該方法,計算函式會根據聚集計算結果更新內部狀態。當輸 入值合法或者正確計算了,則 就返回true。
terminatePartial():Hive需要部分聚集結果的時候會呼叫該方法,必須要返回一個封裝了聚集計算當前狀態的物件。
merge():Hive進行合併一個部分聚集和另一個部分聚集的時候會呼叫該方法。
terminate():Hive最終聚集結果的時候就會呼叫該方法。計算函式需要把狀態作為一個值返回給使用者。
mapreduce階段呼叫函式
MAP
init()
iterate()
terminatePartial()
Combiner
merge()
terminatePartial()
REDUCE
init()
merge()
terminate()
一、自定義UDAF函式
點選(此處)摺疊或開啟
-
package hive.org.ruozedata;
-
-
import java.util.*;
-
-
import org.apache.hadoop.hive.ql.exec.UDAF;
-
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
-
import org.apache.log4j.Logger;
-
-
public class UserClickUDAF extends UDAF {
-
-
// 日誌物件初始化
-
public static Logger logger = Logger.getLogger(UserClickUDAF.class);
-
-
// 靜態類實現UDAFEvaluator
-
public static class Evaluator implements UDAFEvaluator {
-
// 設定成員變數,儲存每個統計範圍內的總記錄數
-
private static Map<String, String> courseScoreMap;
-
-
private static Map<String, String> city_info;
-
private static Map<String, String> product_info;
-
private static Map<String, String> user_click;
-
-
//初始化函式,map和reduce均會執行該函式,起到初始化所需要的變數的作用
-
public Evaluator() {
-
init();
-
}
-
-
// 初始化函式間傳遞的中間變數
-
public void init() {
-
courseScoreMap = new HashMap<String, String>();
-
city_info = new HashMap<String, String>();
-
product_info = new HashMap<String, String>();
-
}
-
-
//map階段,返回值為boolean型別,當為true則程式繼續執行,當為false則程式退出
-
public boolean iterate(String pcid, String pcname, String pccount) {
-
if (pcid == null || pcname == null || pccount == null) {
-
return true;
-
}
-
-
if (pccount.equals("-1")) {
-
// 城市表
-
city_info.put(pcid, pcname);
-
}
-
else if (pccount.equals("-2")) {
-
// 產品表
-
product_info.put(pcid, pcname);
-
}
-
else
-
{
-
// 處理使用者點選關聯
-
unionCity_Prod_UserClic1(pcid, pcname, pccount);
-
}
-
return true;
-
}
-
-
// 處理使用者點選關聯
-
private void unionCity_Prod_UserClic1(String pcid, String pcname, String pccount) {
-
if (product_info.containsKey(pcid)) {
-
if (city_info.containsKey(pcname)) {
-
String city_name = city_info.get(pcname);
-
String prod_name = product_info.get(pcid);
-
String cp_name = city_name + prod_name;
-
-
// 如果之前已經Put過Key值為區域資訊,則把記錄相加處理
-
if (courseScoreMap.containsKey(cp_name)) {
-
int pcrn = 0;
-
String strTemp = courseScoreMap.get(cp_name);
-
String courseScoreMap_pn = strTemp.substring(strTemp.lastIndexOf("\t".toString())).trim();
-
pcrn = Integer.parseInt(pccount) + Integer.parseInt(courseScoreMap_pn);
-
-
courseScoreMap.put(cp_name, city_name + "\t" + prod_name + "\t" + Integer.toString(pcrn));
-
}
-
else {
-
courseScoreMap.put(cp_name, city_name + "\t" + prod_name + "\t" + pccount);
-
}
-
}
-
}
-
}
-
-
/**
-
* 類似於combiner,在map範圍內做部分聚合,將結果傳給merge函式中的形參mapOutput
-
* 如果需要聚合,則對iterator返回的結果處理,否則直接返回iterator的結果即可
-
*/
-
public Map<String, String> terminatePartial() {
-
return courseScoreMap;
-
}
-
-
// reduce 階段,用於逐個迭代處理map當中每個不同key對應的 terminatePartial的結果
-
public boolean merge(Map<String, String> mapOutput) {
-
this.courseScoreMap.putAll(mapOutput);
-
return true;
-
}
-
// 處理merge計算完成後的結果,即對merge完成後的結果做最後的業務處理
-
public String terminate() {
-
return courseScoreMap.toString();
-
}
-
}
- }
點選(此處)摺疊或開啟
-
DROP TEMPORARY FUNCTION user_click;
-
-
add jar /data/hive_udf-1.0.jar;
-
- CREATE TEMPORARY FUNCTION user_click AS 'hive.org.ruozedata.UserClickUDAF';
點選(此處)摺疊或開啟
-
insert overwrite directory '/works/tmp1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
-
select regexp_replace(substring(rs, instr(rs, '=')+1), '}', '') from (
-
select explode(split(user_click(pcid, pcname, type),',')) as rs from (
-
select * from (
-
select '-2' as type, product_id as pcid, product_name as pcname from product_info
-
union all
-
select '-1' as type, city_id as pcid,area as pcname from city_info
-
union all
-
select count(1) as type,
-
product_id as pcid,
-
city_id as pcname
-
from user_click
-
where action_time='2016-05-05'
-
group by product_id,city_id
-
) a
-
order by type) b
- ) c
點選(此處)摺疊或開啟
-
create external table tmp1(
-
city_name string,
-
product_name string,
-
rn string
-
)
-
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
- location '/works/tmp1';
點選(此處)摺疊或開啟
-
select * from (
-
select city_name,
-
product_name,
-
floor(sum(rn)) visit_num,
-
row_number()over(partition by city_name order by sum(rn) desc) rn,
-
'2016-05-05' action_time
-
from tmp1
-
group by city_name,product_name
- ) a where rn <=3
此方法可能不會很好,但最少可以起到一定的拋磚引玉的功效。希望大家不吝賜教!
若澤大資料交流群:671914634
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31511218/viewspace-2150561/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hive學習筆記之十:使用者自定義聚合函式(UDAF)Hive筆記函式
- Hive中自定義函式Hive函式
- HIVE中的自定義函式Hive函式
- hive 3.0.0自定義函式Hive函式
- Hive常用函式及自定義函式Hive函式
- 【Spark篇】---SparkSQL中自定義UDF和UDAF,開窗函式的應用SparkSQL函式
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- Clickhouse 使用者自定義外部函式函式
- Hive中新增自定義函式(UDF)方法及實踐Hive函式
- HIVE自定義函式的擴充套件Hive函式套件
- Hive--->建立自定義的UDTF函式Hive函式
- Loadrunner 使用者自定義函式使用[轉]函式
- jQuery如何實現新增自定義函式jQuery函式
- 教你認識AWK 使用者自定義函式函式
- Hive中配置與編寫自定義UDF函式Hive函式
- Oracle中自定義函式Oracle函式
- MySQL排名函式實現MySql函式
- SQLserver自定義樣式主鍵-函式實現篇SQLServer函式
- Spark SQL使用簡介(2)--UDF(使用者自定義函式)SparkSQL函式
- spark2.4.3 sparkSQL 使用者自定義函式筆記SparkSQL函式筆記
- 【Sqoop+Hive+MySQL】使用者某時間範圍,區域最受歡迎的Top N的產品OOPHiveMySql
- 分析函式之排名統計函式
- Holer實現自定義域名訪問本地WEB應用Web
- 使用者自定義聚集函式--求平均值(avg)--myavg函式
- 案例展示自定義C函式的實現過程函式
- 自定義函式實現字串分割,返回集合型別函式字串型別
- JavaScript 設計模式系列 – 自定義函式(惰性函式)JavaScript設計模式函式
- JavaScript 設計模式系列 - 自定義函式(惰性函式)JavaScript設計模式函式
- MySQL使用之五_自定義函式和自定義過程MySql函式
- XP不能訪問區域網使用者的解決方案
- redis設計統計使用者訪問量Redis
- SAP不同的產品是如何支援使用者建立自定義欄位的
- SparkSQL中的UDF、UDAF、UDTF實現SparkSQL
- 訪問使用者中心實現認證
- shell自定義函式函式
- Oracle 自定義函式Oracle函式
- perl自定義函式函式
- MS SQL Server 建立返回表型別的使用者自定義函式SQLServer型別函式