Hive编程(十三)【函数】

13.1 发现和描述函数

SHOW FUNCTIONS列举当前Hive会话中所加载的所有函数名。包括内置的和用户自定义的函数。

hive> SHOW FUNCTIONS;
abs
acos
and
array

使用DESCRIBE FUNCTION显示函数的简短描述信息。

hive> DESCRIBE FUNCTION concat;
concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN

使用DESCRIBE FUNCTION EXTENDED查看更详细的描述。

hive> DESCRIBE FUNCTION EXTENDED concat;
concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN
Returns NULL if any argument is NULL.
Example:
> SELECT concat('abc', 'def') FROM src LIMIT 1;
'abcdef'

13.2 调用函数

SELECT concat(column1,column2) AS x FROM table;

13.3 标准函数

13.4 聚合函数

所有的聚合函数、用户自定义函数和内置函数,都统称为用户自定义聚合函数(UDAF)。

聚合函数接受从零行到多行的零个到多个的列,返回一个单一的值。如:

hive> SELECT avg(price_close)
> FROM stocks
> WHERE exchange = 'NASDAQ' AND symbol = 'AAPL';

聚合函数通常和GROUP BY一起使用。如:

hive> SELECT year(ymd), avg(price_close) FROM stocks
> WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'
> GROUP BY year(ymd);
1984 25.578625440597534
1985 20.193676221040867
1986 32.46102808021274

13.5 表生成函数

所有的表生成函数,包括用户自定义的和内置的都统称为用户自定义表生成函数(UDTF)。

表生成函数,接受零个或多个输入,产生多列或多好输出。

hive> SELECT array(1,2,3) FROM dual;
[1,2,3]

explode() 函数以array类型作为输入,然后对数组中的元素进行迭代,返回多行结果,一行一个数组元素值。

hive> SELECT explode(array(1,2,3)) AS element FROM src;
1
2
3

explode() 函数的错误使用方式:

hive> SELECT name, explode(subordinates) FROM employees;
FAILED: Error in semantic analysis: UDTF's are not supported outside
the SELECT clause, nor nested in expressions

Hive提供了LATERAL VIEW功能来实现这种查询:

hive> SELECT name, sub
> FROM employees
> LATERAL VIEW explode(subordinates) subView AS sub;
John Doe    Mary Smith
John Doe    Todd Jones
Mary Smith  Bill King

LATERAL VIEWexplode函数得到的行转列的结果集合在一起。使用LATERAL VIEW需要指定视图别名和生成的新列的别名。在该例子中分别是subViewsub

13.6 一个通过日期计算其星座的UDF

样本数据集为:

edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10
bob,bob@test.net,10-10-2004,10.10.10.1,M,50
sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2

创建表,且将数据载入到表中

hive > CREATE TABLE IF NOT EXISTS littlebigdata(
> name STRING,
> email STRING,
> bday STRING,
> ip STRING,
> gender STRING,
> anum INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive> LOAD DATA LOCAL INPATH '${env:HOME}/littlebigdata.txt'
> INTO TABLE littlebigdata;

函数的输入是一个日期,输出期望标识为该用户星座的字符串。

Java Code

package org.apache.hadoop.hive.contrib.udf.example;

import java.util.Date;
import java.text.SimpleDateFormat;
import org.apache.hadoop.hive.ql.exec.UDF;

@Description(name = "zodiac",
value = "_FUNC_(date) - from the input date string "+"or separate month and day arguments, returns the sign of the Zodiac.",
extended = "Example:\n" + " > SELECT _FUNC_(date_string) FROM src;\n"+ " > SELECT _FUNC_(month, day) FROM src;")

public class UDFZodiacSign extends UDF{

    private SimpleDateFormat df;

    public UDFZodiacSign(){
        df = new SimpleDateFormat("MM-dd-yyyy");
    }

    public String evaluate( Date bday ){
        return this.evaluate( bday.getMonth(), bday.getDay() );
    }

    public String evaluate(String bday){
        Date date = null;
        try {
            date = df.parse(bday);
        } catch (Exception ex) {
            return null;
        }
        return this.evaluate( date.getMonth()+1, date.getDay() );
    }

    public String evaluate( Integer month, Integer day ){
        if (month==1) {
            if (day < 20 ){
                return "Capricorn";
            } else {
                return "Aquarius";
            }
        }
        if (month==2){
            if (day < 19 ){
                return "Aquarius";
            } else {
                return "Pisces";
            }
        }
        /* ...other months here */
        return null;
    }

}

编写UDF,需要继承UDF类,并实现evaluate()方法。

13.7 UDF与GenericUDF

13.8 不变函数

13.9 用户自定义函数

13.10 用户自定义表生成函数

13.10.1 可以产生多行数据的UDTF

13.10.2 可以产生具有多个字段的单行数据的UDTF

13.10.3 可以模拟更复杂数据类型的UDTF

13.11 在UDF中访问分布式缓存

13.12 以函数的方式使用注解

13.12.1 定数性(deterministic)标注

13.12.2 状态性(stateful)标注

13.12.3 唯一性

13.13 宏命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值