再来看一个分数统计的小例子。

在Hive中存在如下一张表:

  1. hive> describe tb_test2;
  2. OK
  3. name    string
  4. score_list  array<map<string,int>>
  5. Time taken: 0.074 seconds
  6. hive> select * from tb_test2;
  7. OK
  8. A   [{"math":100,"english":90,"history":85}]
  9. B   [{"math":95,"english":80,"history":100}]
  10. C   [{"math":80,"english":90,"histroy":100}]
  11. Time taken: 0.107 seconds

编写genericUDF.

  1. package com.wz.udf;
  2. import org.apache.hadoop.io.Text;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
  5. import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
  6. import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
  7. import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
  8. import org.apache.hadoop.hive.ql.metadata.HiveException;
  9. import org.apache.hadoop.hive.serde2.lazy.LazyString;
  10. import org.apache.hadoop.hive.serde2.lazy.LazyMap;
  11. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  12. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
  13. import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
  14. import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
  15. import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
  16. import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
  17. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
  18. import org.apache.hadoop.hive.serde2.objectinspector.StructField;
  19. import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
  20. import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
  21. import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
  22. import java.util.ArrayList;
  23. public class helloGenericUDFNew extends GenericUDF {
  24. ////输入变量定义
  25. private ObjectInspector nameObj;
  26. private ListObjectInspector listoi;
  27. private MapObjectInspector mapOI;
  28. private ArrayList<Object> valueList = new ArrayList<Object>();
  29. @Override
  30. public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
  31. nameObj = (ObjectInspector)arguments[0];
  32. listoi = (ListObjectInspector)arguments[1];
  33. mapOI = ((MapObjectInspector)listoi.getListElementObjectInspector());
  34. //输出结构体定义
  35. ArrayList structFieldNames = new ArrayList();
  36. ArrayList structFieldObjectInspectors = new ArrayList();
  37. structFieldNames.add("name");
  38. structFieldNames.add("totalScore");
  39. structFieldObjectInspectors.add( PrimitiveObjectInspectorFactory.writableStringObjectInspector );
  40. structFieldObjectInspectors.add( PrimitiveObjectInspectorFactory.writableIntObjectInspector );
  41. StructObjectInspector si2;
  42. si2 = ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames, structFieldObjectInspectors);
  43. return si2;
  44. }
  45. @Override
  46. public Object evaluate(DeferredObject[] arguments) throws HiveException{
  47. LazyString LName = (LazyString)(arguments[0].get());
  48. String strName = ((StringObjectInspector)nameObj).getPrimitiveJavaObject( LName );
  49. int nelements = listoi.getListLength(arguments[1].get());
  50. int nTotalScore=0;
  51. valueList.clear();
  52. //遍历list
  53. for(int i=0;i<nelements;i++)
  54. {
  55. LazyMap LMap = (LazyMap)listoi.getListElement(arguments[1].get(),i);
  56. //获取map中的所有value值
  57. valueList.addAll(mapOI.getMap(LMap).values());
  58. for (int j = 0; j < valueList.size(); j++)
  59. {
  60. nTotalScore+=Integer.parseInt(valueList.get(j).toString());
  61. }
  62. }
  63. Object[] e;
  64. e = new Object[2];
  65. e[0] = new Text(strName);
  66. e[1] = new IntWritable(nTotalScore);
  67. return e;
  68. }
  69. @Override
  70. public String getDisplayString(String[] children) {
  71. assert( children.length>0 );
  72. StringBuilder sb = new StringBuilder();
  73. sb.append("helloGenericUDFNew(");
  74. sb.append(children[0]);
  75. sb.append(")");
  76. return sb.toString();
  77. }
  78. }

在Hive中执行,结果如下:

  1. hive> add jar /home/wangzhun/hive/hive-0.8.1/lib/helloGenericUDFNew.jar;
  2. Added /home/wangzhun/hive/hive-0.8.1/lib/helloGenericUDFNew.jar to class path
  3. Added resource: /home/wangzhun/hive/hive-0.8.1/lib/helloGenericUDFNew.jar
  4. hive> create temporary function hellonew as 'com.wz.udf.helloGenericUDFNew';
  5. OK
  6. Time taken: 0.016 seconds
  7. hive> select hellonew(tb_test2.name,tb_test2.score_list) from tb_test2;
  8. Total MapReduce jobs = 1
  9. Launching Job 1 out of 1
  10. Number of reduce tasks is set to 0 since there's no reduce operator
  11. Starting Job = job_201312091733_0018, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201312091733_0018
  12. Kill Command = /home/wangzhun/hadoop/hadoop-0.20.2/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201312091733_0018
  13. Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
  14. 2013-12-09 22:31:22,328 Stage-1 map = 0%,  reduce = 0%
  15. 2013-12-09 22:31:25,354 Stage-1 map = 100%,  reduce = 0%
  16. 2013-12-09 22:31:28,390 Stage-1 map = 100%,  reduce = 100%
  17. Ended Job = job_201312091733_0018
  18. MapReduce Jobs Launched:
  19. Job 0: Map: 1   HDFS Read: 99 HDFS Write: 18 SUCESS
  20. Total MapReduce CPU Time Spent: 0 msec
  21. OK
  22. {"people":"A","totalscore":275}
  23. {"people":"B","totalscore":275}
  24. {"people":"C","totalscore":270}
  25. Time taken: 21.7 seconds

Hive GenericUDF2的更多相关文章

  1. 初识Hadoop、Hive

    2016.10.13 20:28 很久没有写随笔了,自打小宝出生后就没有写过新的文章.数次来到博客园,想开始新的学习历程,总是被各种琐事中断.一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版 ...

  2. Hive安装配置指北(含Hive Metastore详解)

    个人主页: http://www.linbingdong.com 本文介绍Hive安装配置的整个过程,包括MySQL.Hive及Metastore的安装配置,并分析了Metastore三种配置方式的区 ...

  3. Hive on Spark安装配置详解(都是坑啊)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/p/a7f75b868568 简介 本文主要记录如何安装配置Hive on Sp ...

  4. HIVE教程

    完整PDF下载:<HIVE简明教程> 前言 Hive是对于数据仓库进行管理和分析的工具.但是不要被“数据仓库”这个词所吓倒,数据仓库是很复杂的东西,但是如果你会SQL,就会发现Hive是那 ...

  5. 基于Ubuntu Hadoop的群集搭建Hive

    Hive是Hadoop生态中的一个重要组成部分,主要用于数据仓库.前面的文章中我们已经搭建好了Hadoop的群集,下面我们在这个群集上再搭建Hive的群集. 1.安装MySQL 1.1安装MySQL ...

  6. hive

    Hive Documentation https://cwiki.apache.org/confluence/display/Hive/Home 2016-12-22  14:52:41 ANTLR  ...

  7. 深入浅出数据仓库中SQL性能优化之Hive篇

    转自:http://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job,一个Map Reduce Job又有Map,R ...

  8. Hive读取外表数据时跳过文件行首和行尾

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...

  9. Hive索引功能测试

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 从Hive的官方wiki来看,Hive0.7以后增加了一个对表建立index的功能,想试下性能是 ...

随机推荐

  1. HashMap实现原理分析--面试详谈

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  2. 七. Python基础(7)--文件的读写

    七. Python基础(7)--文件的读写 1 ● 文件读取的知识补充 f = open('file', encoding = 'utf-8') content1 = f.read() content ...

  3. python验证代理IP

    接上一篇保存的IP地址,进行验证 # -*- coding: utf-8 -*- import requests from threading import Thread import threadi ...

  4. SQL-21 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

    题目描述 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序CREATE TABLE `employees` (`emp_no` ...

  5. MySQL输入密码后闪退

    刚刚我遇到这个问题,服务里MySQL是启状态的,所以我求助百度,发现很多种说法,我试了几个,还是不行,后来想起来我的密码不对,于是换了正确的密码试了一下,没毛病,进去了. 所以输入密码闪退时,首先确定 ...

  6. <codis><jodis>

    Overview For codis and jodis. Codis TBD... Jodis Java client for codis. Jodis is a java client for c ...

  7. 2010年腾讯前端面试题学习(jquery,html,css部分)

    看了牛人写的回忆文章,里面有2010年腾讯的前端面试题,里面涉及到不少基础性的问题,js部分已学习,这是jquery,html和css部分,学习一下:) 原文地址:https://segmentfau ...

  8. 2019-03-26-day019-面向对象耦合与组合

    作业 #对象的耦合 class Circle: def __init__(self,r): self.r = r def area(self): return 3.14*self.r**2 def p ...

  9. nodejs环境下配置运行mysql

    首先需要在本地运行node环境   必须在本地安装mysql(可以用xampp里面的) 在node环境下引入mysql模块   命令: npm install node-mysql 运用例子(前提条件 ...

  10. HDU 6140 17多校8 Hybrid Crystals(思维题)

    题目传送: Hybrid Crystals Problem Description > Kyber crystals, also called the living crystal or sim ...