Hive+UDAF简单示例

来源:互联网 发布:大数据建模工程师 编辑:程序博客网 时间:2024/05/01 15:50

转载自 http://blog.csdn.net/wisgood/article/details/26167367

在之前的一篇博文中,演示了一个使用通用UDTF来计算总分的小示例,下面用UDAF来做这个工作。

       1.编写UDAF。

         

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.wz.udf;  
  2.   
  3. import org.apache.hadoop.hive.ql.exec.UDAF;  
  4. import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;  
  5. import org.apache.hadoop.io.Text;  
  6. import java.util.HashMap;  
  7. import java.util.Map;  
  8. public class helloUDAF extends UDAF {  
  9.     public static class Evaluator implements UDAFEvaluator  
  10.     {  
  11.        //存放不同学生的总分  
  12.        private static Map<String,Integer> ret;  
  13.   
  14.        public Evaluator()  
  15.        {  
  16.        super();  
  17.            init();  
  18.        }  
  19.   
  20.        //初始化  
  21.        public void init()  
  22.        {  
  23.       ret = new HashMap<String,Integer>();  
  24.        }  
  25.   
  26.        //map阶段,遍历所有记录  
  27.        public boolean iterate(String strStudent,int nScore)  
  28.        {   
  29.          if(ret.containsKey(strStudent))  
  30.          {  
  31.             int nValue = ret.get(strStudent);  
  32.             nValue +=nScore;  
  33.             ret.put(strStudent,nValue);  
  34.          }  
  35.          else  
  36.          {  
  37.            ret.put(strStudent,nScore);  
  38.          }  
  39.          return true;  
  40.        }  
  41.       
  42.        //返回最终结果   
  43.        public Map<String,Integer> terminate()  
  44.        {  
  45.          return ret;  
  46.        }  
  47.   
  48.        //combiner阶段,本例不需要  
  49.        public Map<String,Integer> terminatePartial()   
  50.        {  
  51.           return ret;  
  52.        }  
  53.   
  54.        //reduce阶段  
  55.        public boolean merge(Map<String,Integer> other)  
  56.        {  
  57.             for (Map.Entry<String, Integer> e : other.entrySet()) {  
  58.                 ret.put(e.getKey(),e.getValue());  
  59.             }  
  60.             return true;  
  61.        }  
  62.     }     
  63. }  


       2.编译并打包成jar包。

           javac -classpath /home/wangzhun/hadoop/hadoop-0.20.2/hadoop-0.20.2-core.jar:/home/wangzhun/hive/hive-0.8.1/lib/hive-exec-0.8.1.jar helloUDAF.java

          jar cvf helloUDAF.jar com/wz/udf/helloUDAF*.class

      3.在hive下面调用,创建临时函数,并执行查询得到结果。

        

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. hive> add jar /home/wangzhun/hive/hive-0.8.1/lib/helloUDAF.jar;                  
  2. Added /home/wangzhun/hive/hive-0.8.1/lib/helloUDAF.jar to class path  
  3. Added resource: /home/wangzhun/hive/hive-0.8.1/lib/helloUDAF.jar  
  4. hive> create temporary function helloudaf as 'com.wz.udf.helloUDAF';             
  5. OK  
  6. Time taken: 0.02 seconds  
  7. hive> select helloudaf(studentScore.name,studentScore.score) from studentScore;  
  8. Total MapReduce jobs = 1  
  9. Launching Job 1 out of 1  
  10. Number of reduce tasks determined at compile time: 1  
  11. In order to change the average load for a reducer (in bytes):  
  12.   set hive.exec.reducers.bytes.per.reducer=<number>  
  13. In order to limit the maximum number of reducers:  
  14.   set hive.exec.reducers.max=<number>  
  15. In order to set a constant number of reducers:  
  16.   set mapred.reduce.tasks=<number>  
  17. Starting Job = job_201311282251_0009, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201311282251_0009  
  18. Kill Command = /home/wangzhun/hadoop/hadoop-0.20.2/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201311282251_0009  
  19. Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1  
  20. 2013-11-29 00:34:01,290 Stage-1 map = 0%,  reduce = 0%  
  21. 2013-11-29 00:34:04,316 Stage-1 map = 100%,  reduce = 0%  
  22. 2013-11-29 00:34:13,403 Stage-1 map = 100%,  reduce = 100%  
  23. Ended Job = job_201311282251_0009  
  24. MapReduce Jobs Launched:   
  25. Job 0: Map: 1  Reduce: 1   HDFS Read: 40 HDFS Write: 12 SUCESS  
  26. Total MapReduce CPU Time Spent: 0 msec  
  27. OK  
  28. {"A":290,"B":325}  
  29. Time taken: 32.275 seconds  
0 0
原创粉丝点击