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 VIEW
将explode
函数得到的行转列的结果集合在一起。使用LATERAL VIEW
需要指定视图别名和生成的新列的别名。在该例子中分别是subView
和sub
。
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()
方法。