基本语法

Hive的详细语法见官方文档。
https://cwiki.apache.org/confluence/display/Hive/LanguageManual

数据类型

  • 整数类型:TINYINT、SMALLINT、INT、BIGINT
  • 浮点类型:FLOAT、DOUBLE、DECIMAL
  • 文本类型:STRING、CHAR、VARCHAR
  • 时间类型:DATE、TIMESTAMP、INTERVAL
  • 布尔类型:BOOLEAN
  • 二进制类型:BINARY
  • 复杂类型:ARRAY、MAP、STRUCT、UNIONTYPE

一般很少直接将表字段定义成复杂类型。但是复杂类型在行转列、列转行的场景下,作为中间类型使用非常方便。

有两个特别需要注意的地方:

  1. 类型隐式转换
    Hive计算过程中,不同的类型会做隐式转换,不过有很多坑,建议使用cast显示转换。
  2. null比较也要特别注意
    null值和其他任何类型做比较都是未定义的,甚至两个null比较也是这样。需要用is null和nvl先对null值做特殊处理。比如下面的sql,如果col是null值,那么无论是任何类型,返回的都是4
select
    case
        when col > '1' then 1
        when col = '1' then 2
        when col < '1' then 3
        else 4
    end as result

类型隐式转换全图如下:
hive-type-conversion.jpg

聚合和开窗

Hive提供了100多个内置函数,以方便使用。重点说一下聚合函数。

SELECT
    class,
    COUNT(1) AS num,
    AVG(score) AS score_avg
FROM student
    GROUP BY class;

上面这个SQL算每个班的学生人数和平均分。但是一般业务场景不会这么简单,都会有各种复杂条件。比如,找到每个班的前10名,并且算一下他们的平均分。这就需要开窗了。开窗的本质是在聚合之前赋予记录一些特征,以在聚合时可以区别对待。

SELECT
    class,
    SUM(CASE WHEN rank <= 10 THEN 1 ELSE 0 END) AS num,
    AVG(CASE WHEN rank <= 10 THEN score ELSE NULL END) AS score_avg
FROM
    (
        SELECT
            class,
            core,
            ROW_NUMBER() OVER(PARTITION BY class ORDER BY score DESC) AS rank
        FROM student
    ) AS ranked_students
GROUP BY class;

在处理连续型分析时,LED和LAG函数非常好用。比如在上面的基础上,找到前10名中已经连续3次分数越来越高的同学。

SELECT
    DISTINCT name
FROM
(
    SELECT
        name,
        score,
        LAG(score, 1) OVER (PARTITION BY id ORDER BY score DESC) AS last_score,
        LAG(score, 2) OVER (PARTITION BY id ORDER BY score DESC) AS last2_score
    FROM
    (
        SELECT
            name,
            score,
            ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC, id) AS rank
        FROM
            student
    ) AS ranked_students
    WHERE
        rank <= 10
) AS filtered_students
WHERE
    score > last_score
    AND (last_score IS NULL OR last_score > last2_score);

开窗能解决绝大部分问题,如果还不行,就多来一层。

自定义函数

为了适应复杂的数据分析场景,Hive支持用户自定义函数以扩展功能。自定义函数分三种

  • UDF(User-Define Function)
  • UDAF(User-Define Aggregate Function)
  • UDTF(User-Defined Table-Generating Functions)

以下是使用自定义UDF的过程。
1. 自定义UDF
实现UDF的evaluate方法

public class AddUDF extends UDF {
    public IntWritable evaluate(Integer a, Integer b) {
        if (a == null || b == null) {
            return null;
        }
        return new IntWritable(a + b);
    }
}
  1. 编译成jar包并且加载
    ADD JAR /path/to/your/add-udf.jar;
    可以在SQL里每次都临时加载,也可以加载为默认。
  2. 在SQL中使用
create temporary function add_udf as 'com.test.hive.udf.addudf';
select add_udf(1, 2) as result;


微信扫描下方的二维码阅读本文

上一篇: Hive学习-源码阅读

下一篇: Spark学习

Categories: 大数据

2 Comments

abc · 2024-09-07 at 19:09

再评论一下

abc · 2024-09-07 at 19:06

第一条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注