JavaInterview
  • README
  • 架构篇
    • 分布式一致性协议
    • 设计模式
    • ElasticSearch
    • MySQL
    • Redis
    • UML 图总结
  • 大数据篇
    • Hadoop 架构
    • Hive
    • Hive 函数
    • kafka_1
    • MaxList以及Set模块
  • 书籍总结
  • 代码篇
    • 动态规划(Dynamic Programming)
    • order_print_num
  • IO 篇
    • 多线程 N 次写文件
    • 多线程、进程、多核 CPU 详细介绍
  • Java 基础知识
    • 异常介绍
    • StringBuffer 和 StringBuilder
    • 线程池
    • 数据结构篇
      • BlockingQueue 和 BlockingDeque 内部实现分析
    • Java8
    • 关键字篇
      • 关键字-transient
      • 关键字-volatile
  • 深入浅出 JVM
    • garbage_collectors
    • JVM 参数
  • README
  • machinelearning
    • model
    • 推荐系统整理
    • tensorflow 入门
  • 排序篇
    • 冒泡排序
    • 基数排序
    • 选择排序
    • 插入排序
    • 希尔排序
    • 归并排序
    • 快速排序
    • 堆排序
    • 计数排序
    • 桶排序
  • Web 篇
    • JavaWeb 中 POJO、BO、VO、DO、DTO、DAO、PO 详细介绍
    • Filter 和 Interceptor 详解
    • HTTP 请求的完整过程
    • Spring 配置
    • Spring IoC
    • Spring 全家桶
Powered by GitBook
On this page
  • 依赖
  • UDF(User-Defined-Function)
  • GenericUDF
  • GenericUDTF

Was this helpful?

  1. 大数据篇

Hive 函数

相信大家对 Hive 都不陌生,那么大家肯定用过 Hive 里面各种各样的函数。可能大家都会使用这些函数,但是没有自己动手去写过 Hive 里面的函数。下面主要来介绍一下 Hive 里面的各种函数。

依赖

开发 Hive UDF 之前,我们需要引入一个 jar,这个 jar 就是 hive-exec,里面定义了各种我们自定义的 UDF 函数的类型:UDF、GenericUDF、GenericUDTF 等。

 <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.1.1</version>
 </dependency>

UDF(User-Defined-Function)

UDF:用户自定义函数,也是实现起来最简单的一种函数。支持的就是一进一出类型的函数。

如何实现?

  • 继承 UDF 类。

  • 重写 evaluate 方法。

  • 将该 java 文件打包成 jar。

  • 在 beeline(hive 的一种终端)中输入如下命令:

    • 0: jdbc:hive2://localhost:10000> add jar /data/tommyyang/HiveUDF.jar;

    • 0: jdbc:hive2://localhost:10000> create temporary function ip2loc as 'cn.tommyyang.IPToLocation';

    • 0: jdbc:hive2://localhost:10000> select ip2loc("118.28.1.1");

    • 0: jdbc:hive2://localhost:10000> drop temporary function ip2loc;

具体代码实现:

@Description(
        name = "ip2loc",
        value = "_FUNC_(str) - covert ip to location",
        extended = "Example:\n" +
                "  > SELECT ip2loc(ip) FROM ips;\n" +
                "  [中国,上海]"
)
public class IPToLocation extends UDF {

    private static final InputStream stream = IPToLocation.class.getClassLoader().getResourceAsStream("ipipfree.ipdb");
    private static City db = null;

    static {
        try {
            db = new City(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 具体实现逻辑
    public ArrayList<String> evaluate(Text s) throws IOException, IPFormatException {
        ArrayList<String> allTexts = new ArrayList<>();
        if (s != null) {
            CityInfo info = db.findInfo(s.toString(), "CN");
            allTexts.add(info.getCountryName());
            allTexts.add(info.getRegionName());
            allTexts.add(info.getCityName());
        }
        return allTexts;
    }

}

GenericUDF

相对 UDF,GenericUDF 就复杂一些,下面我们通过创建一个 containsString 方法的例子,

GenericUDTF

PreviousHiveNextkafka_1

Last updated 5 years ago

Was this helpful?

@Description 为该 UDF 的描述,你可以通过命令 desc function ip2loc查看具体的描述;如下图: