数学函数
下面表格中的函数为Hive的内置数学函数,大部分当参数为NULL时返回NULL。
返回类型 |
函数名 |
描述 |
|
round(double a) |
返回a经过四舍五入的 |
double |
round(double a, int d) |
返回a经过四舍五入,保留d位小数的DOUBLE 值 |
bigint |
floor(double a) |
返回小于等于a的最大BIGINT 值 |
bigint |
ceil(double a), ceiling(double a) |
返回大于等于a的最小BIGINT 值 |
double |
rand(), rand(int seed) |
返回一个均匀分布在0到1之间的随机数,指定seed将会确保产生的随机数序列是确定的 |
double |
exp(double a), exp(decimal a) |
返回ea |
double |
ln(double a), ln(decimal a) |
返回a的自然对数值 |
double |
log10(double a), log10(decimal a) |
返回a的以10为底的对数值 |
double |
log2(double a), log2(decimal a) |
返回a的以2为底的对数值 |
double |
log(double base, double a) |
返回a以base为底的对数值,除了DOUBLE 类型,还可以是DECIMAL 类型,并且两种类型可以混合使用 |
double |
pow(double a, double p), power(double a, double p) |
返回ap |
double |
sqrt(double a), sqrt(decimal a) |
返回a的平方根 |
string |
bin(bigint a) |
返回a的二进制格式 |
string |
hex(bigint a) hex(string a) hex(binary a) |
如果参数为整数或者二进制,返回十六进制的字符串,如果参数为字符串,该函数将每个字符转换为十六进制表示,并返回结果字符串 |
binary |
unhex(string a) |
将每对字符解释为十六进制并转换为该十六进制的字节表示 |
string |
conv(bigint num, int from_base, int to_base), conv(string num, int from_base, int to_base) |
将数值从一种进制表示转换为另一种进制,比如从二进制转换为十进制 |
double |
abs(double a) |
返回a的绝对值 |
int or double |
pmod(int a, int b), pmod(double a, double b) |
返回a mod b的正数值 |
double |
sin(double a), sin(decimal a) |
返回a的正弦值,a为弧度值 |
double |
asin(double a), asin(decimal a) |
如果1<=a<=-1,返回a的反正弦值,否则返回NULL |
double |
cos(double a), cos(decimal a) |
返回a的余弦值,a为弧度值 |
double |
acos(double a), acos(decimal a) |
如果-1<=a<=1,返回a的反余弦值,否则返回NULL |
double |
tan(double a), tan(decimal a) |
返回a的正切值,a为弧度值 |
double |
atan(double a), atan(decimal a) |
返回a的反正切值 |
double |
degrees(double a), degrees(decimal a) |
将a从弧度值转换为对应的角度值 |
double |
radians(double a), radians(double a) |
将a从角度值转换为弧度值 |
int or double |
positive(int a), positive(double a) |
返回a |
int or double |
negative(int a), negative(double a) |
返回-a |
double or int |
sign(double a), sign(decimal a) |
如果a为正数返回1.0,若为负数返回-1.0,否则返回0.0。参数为DECIMAL 时返回值为INT类型 |
double |
e() |
返回e的值 |
double |
pi() |
返回π的值 |
集合函数
下表为Hive中的集合函数。
返回类型 |
函数名 |
描述 |
int |
size(Map<K.V>) |
返回map中的元素数量 |
int |
size(Array<T>) |
返回数组中的元素数量 |
array<K> |
map_keys(Map<K.V>) |
返回未经排序的包含map中keys的数组 |
array<V> |
map_values(Map<K.V>) |
返回未经排序的包含map中values的数组 |
boolean |
array_contains(Array<T>, value) |
如果数组包含value,返回true |
array<t> |
sort_array(Array<T>) |
将数组按照升序排序并返回 |
类型转换函数
下表为Hive中的类型转换函数。
返回类型 |
函数名 |
描述 |
binary |
binary(string|binary) |
将输入参数转换为binary |
<type> |
cast(expr as <type>) |
将表达式的结果expr转换为<type>,如果转换不成功则返回NULL,例如cast(‘2014-08-09’ as date) |
日期函数
下表中为Hive中的内置日期函数。
返回类型 |
函数名 |
描述 |
string |
from_unixtime(bigint unixtime[, string format]) |
将从unix时间(1970-01-01 00:00:00 UTC)开始的秒数转换为表示当前系统时区的时间戳,格式为“1970-01-01 00:00:00” |
bigint |
unix_timestamp() |
返回当前Unix时间戳表示的秒数 |
bigint |
unix_timestamp(string date) |
将格式为yyyy-MM-dd HH:mm:ss的字符串转换为Unix时间戳(秒),使用默认的时区和区域,如果失败返回0 |
bigint |
unix_timestamp(string date, string pattern) |
根据指定模式将时间字符串转换为Unix时间戳(秒),失败返回0 |
string |
to_date(string timestamp) |
返回时间戳字符串的日期部分,如:to_date("1970-01-01 00:00:00") = "1970-01-01" |
int |
year(string date) |
返回日期或时间戳字符串的年部分,如: year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970 |
int |
month(string date) |
返回日期或时间戳字符串的月部分,如: month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11 |
int |
day(string date) dayofmonth(date) |
返回日期或时间戳字符串的天部分,如:day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1 |
int |
hour(string date) |
返回时间戳的小时部分: hour('2009-07-30 12:58:59') = 12, hour('12:58:59') = 12 |
int |
minute(string date) |
返回时间戳的分钟 |
int |
second(string date) |
返回时间戳的秒 |
int |
weekofyear(string date) |
返回时间戳的星期数,如: weekofyear("1970-11-01 00:00:00") = 44, weekofyear("1970-11-01") = 44 |
int |
datediff(string enddate, string startdate) |
返回从startdate到enddate的天数,如: datediff('2009-03-01', '2009-02-27') = 2 |
string |
date_add(string startdate, int days) |
向startdate增加指定的天数,如: date_add('2008-12-31', 1) = '2009-01-01' |
string |
date_sub(string startdate, int days) |
从startdate减去指定的天数,如: date_sub('2008-12-31', 1) = '2008-12-30' |
timestamp |
from_utc_timestamp(timestamp, string timezone) |
假设给定时间戳为UTC时间,并将其转换为给定时区的时间戳 |
timestamp |
to_utc_timestamp(timestamp, string timezone) |
假设给定时间戳为给定时区的时间,将其转换为UTC时间戳 |
条件函数
下表为Hive支持的一些条件函数。
返回类型 |
函数名 |
描述 |
T |
if(boolean testCondition, T valueTrue, T valueFalseOrNull) |
如果testCondition为真,返回valueTrue,否则返回valueFalseOrNull |
T |
COALESCE(T v1, T v2, ...) |
返回第一个不是NULL的v,若全部为NULL,返回NULL |
T |
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END |
当a=b返回c,当a=d返回e,其它返回f |
T |
CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END |
当a=true返回b,当c=true返回d,其它返回e |
字符串函数
下表为Hive内置的字符串函数。
返回类型 |
函数名 |
描述 |
int |
ascii(string str) |
返回str第一个字符串的数值 |
string |
base64(binary bin) |
将二进制参数转换为base64字符串 |
string |
concat(string|binary A, string|binary B...) |
返回将A和B按顺序连接在一起的字符串,如:concat('foo', 'bar') 返回'foobar' |
array<struct<string,double>> |
context_ngrams(array<array<string>>, array<string>, int K, int pf) |
从一组标记化的句子中返回前k个文本 |
string |
concat_ws(string SEP, string A, string B...) |
类似concat() ,但使用自定义的分隔符SEP |
string |
concat_ws(string SEP, array<string>) |
类似concat_ws() ,但参数为字符串数组 |
string |
decode(binary bin, string charset) |
使用指定的字符集将第一个参数解码为字符串,如果任何一个参数为null,返回null。可选字符集为: 'US_ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16' |
binary |
encode(string src, string charset) |
使用指定的字符集将第一个参数编码为binary ,如果任一参数为null,返回null |
int |
find_in_set(string str, string strList) |
返回str在strList中第一次出现的位置,strList为用逗号分隔的字符串,如果str包含逗号则返回0,若任何参数为null,返回null。如: find_in_set('ab', 'abc,b,ab,c,def') 返回3 |
string |
format_number(number x, int d) |
将数字x格式化为'#,###,###.##',四舍五入为d位小数位,将结果做为字符串返回。如果d=0,结果不包含小数点或小数部分 |
string |
get_json_object(string json_string, string path) |
从基于json path的json字符串中提取json对象,返回json对象的json字符串,如果输入的json字符串无效返回null。Json 路径只能有数字、字母和下划线,不允许大写和其它特殊字符 |
boolean |
in_file(string str, string filename) |
如果str在filename中以正行的方式出现,返回true |
int |
instr(string str, string substr) |
返回substr在str中第一次出现的位置。若任何参数为null返回null,若substr不在str中返回0。Str中第一个字符的位置为1 |
int |
length(string A) |
返回A的长度 |
int |
locate(string substr, string str[, int pos]) |
返回substr在str的位置pos后第一次出现的位置 |
string |
lower(string A) lcase(string A) |
返回字符串的小写形式 |
string |
lpad(string str, int len, string pad) |
将str左侧用字符串pad填充,长度为len |
string |
ltrim(string A) |
去掉字符串A左侧的空格,如:ltrim(' foobar ')的结果为'foobar ' |
array<struct<string,double>> |
ngrams(array<array<string>>, int N, int K, int pf) |
从一组标记化的Returns the top-k 句子中返回前K个N-grams |
string |
parse_url(string urlString, string partToExtract [, string keyToExtract]) |
返回给定URL的指定部分,partToExtract的有效值包括HOST,PATH, QUERY, REF, PROTOCOL, AUTHORITY,FILE和USERINFO。例如: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') 返回 'facebook.com'.。当第二个参数为QUERY时,可以使用第三个参数提取特定参数的值,例如: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1') 返回'v1' |
string |
printf(String format, Obj... args) |
将输入参数进行格式化输出 |
string |
regexp_extract(string subject, string pattern, int index) |
使用pattern从给定字符串中提取字符串。如: regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 返回'bar' 有时需要使用预定义的字符类:使用'\s' 做为第二个参数将匹配s,'s'匹配空格等。参数index是Java正则匹配器方法group()方法中的索引 |
string |
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) |
使用REPLACEMENT替换字符串INITIAL_STRING中匹配PATTERN的子串,例如: regexp_replace("foobar", "oo|ar", "") 返回'fb' |
string |
repeat(string str, int n) |
将str重复n次 |
string |
reverse(string A) |
将字符串A翻转 |
string |
rpad(string str, int len, string pad) |
在str的右侧使用pad填充至长度len |
string |
rtrim(string A) |
去掉字符串A右侧的空格,如: rtrim(' foobar ') 返回 ' foobar' |
array<array<string>> |
sentences(string str, string lang, string locale) |
将自然语言文本处理为单词和句子,每个句子在适当的边界分割,返回单词的数组。参数lang和local为可选参数,例如: sentences('Hello there! How are you?') 返回( ("Hello", "there"), ("How", "are", "you") ) |
string |
space(int n) |
返回n个空格的字符串 |
array |
split(string str, string pat) |
用pat分割字符串str,pat为正则表达式 |
map<string,string> |
str_to_map(text[, delimiter1, delimiter2]) |
使用两个分隔符将文本分割为键值对。第一个分隔符将文本分割为K-V 对,第二个分隔符分隔每个K-V 对。默认第一个分隔符为“,“,第二个分隔符为= |
string |
substr(string|binary A, int start) substring(string|binary A, int start) |
返回A从位置start直到结尾的子串 |
string |
substr(string|binary A, int start, int len) substring(string|binary A, int start, int len) |
返回A中从位置start开始,长度为len的子串,如: substr('foobar', 4, 1) 返回 'b' |
string |
translate(string input, string from, string to) |
将input中出现在from中的字符替换为to中的字符串,如果任何参数为null,结果为null |
string |
trim(string A) |
去掉字符串A两端的空格 |
binary |
unbase64(string str) |
将base64字符串转换为二进制 |
string |
upper(string A) ucase(string A) |
返回字符串A的大写形式 |
聚合函数
下表为Hive内置的聚合函数。
返回类型 |
函数名 |
描述 |
BIGINT |
count(*) count(expr) count(DISTINCT expr[, expr_.]) |
count(*) – 返回检索到的行的总数,包括含有NULL值的行。count(expr) – 返回expr表达式不是NULL的行的数量count(DISTINCT expr[, expr]) – 返回expr是唯一的且非NULL的行的数量 |
DOUBLE |
sum(col) sum(DISTINCT col) |
对组内某列求和(包含重复值)或者对组内某列求和(不包含重复值) |
DOUBLE |
avg(col), avg(DISTINCT col) |
对组内某列元素求平均值者(包含重复值或不包含重复值) |
DOUBLE |
min(col) |
返回组内某列的最小值 |
DOUBLE |
max(col) |
返回组内某列的最大值 |
DOUBLE |
variance(col), var_pop(col) |
返回组内某个数字列的方差 |
DOUBLE |
var_samp(col) |
返回组内某个数字列的无偏样本方差 |
DOUBLE |
stddev_pop(col) |
返回组内某个数字列的标准差 |
DOUBLE |
stddev_samp(col) |
返回组内某个数字列的无偏样本标准差 |
DOUBLE |
covar_pop(col1, col2) |
返回组内两个数字列的总体协方差 |
DOUBLE |
covar_samp(col1, col2) |
返回组内两个数字列的样本协方差 |
DOUBLE |
corr(col1, col2) |
返回组内两个数字列的皮尔逊相关系数 |
DOUBLE |
percentile(BIGINT col, p) |
返回组内某个列精确的第p位百分数,p必须在0和1之间 |
array<double> |
percentile(BIGINT col, array(p1 [, p2]...)) |
返回组内某个列精确的第p1,p2,……位百分数,p必须在0和1之间 |
DOUBLE |
percentile_approx(DOUBLE col, p [, B]) |
返回组内数字列近似的第p位百分数(包括浮点数),参数B控制近似的精确度,B值越大,近似度越高,默认值为10000。当列中非重复值的数量小于B时,返回精确的百分数 |
array<double> |
percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) |
同上,但接受并返回百分数数组 |
array<struct {'x','y'}> |
histogram_numeric(col, b) |
使用b个非均匀间隔的箱子计算组内数字列的柱状图(直方图),输出的数组大小为b,double类型的(x,y)表示直方图的中心和高度 |
array |
collect_set(col) |
返回消除了重复元素的数组 |
array |
collect_list(col) |
返回允许重复元素的数组 |
INTEGER |
ntile(INTEGER x) |
该函数将已经排序的分区分到x个桶中,并为每行分配一个桶号。这可以容易的计算三分位,四分位,十分位,百分位和其它通用的概要统计 |
内置 Table-Generating函数(UDTF)
正常的用户定义函数,如concat,输入一个单行然后输出一个单行,但table-generating函数将一个单输入行转换为多个输出行。下表为Hive内置的table-generating函数。
返回类型 |
函数名 |
描述 |
N rows |
explode(ARRAY) |
参数列为数组类型,将数组数据中的每个元素做为一行返回 |
N rows |
explode(MAP) |
将输入map中的每个键值对转换为两列,一列为key,另一列为value,然后返回新行 |
|
inline(ARRAY<STRUCT[,STRUCT]>) |
分解struct数组到表中 |
Array Type |
explode(array<TYPE> a) |
对于数组a中的每个元素,该函数产生包含该元素的行For |
元组 |
json_tuple(jsonStr, k1, k2, ...) |
参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 |
元组 |
parse_url_tuple(url, p1, p2, ...) |
该方法同 |
N rows |
posexplode(ARRAY) |
行为与参数为数组的explode方法相似,但包含项在原始数组中的位置,返回(pos,value)的二元组 |
|
stack(INT n, v_1, v_2, ..., v_k) |
将v_1, ..., v_k 分为n行,每行包含n/k列,n必须为常数 |
使用语法”SELECT udtf(col) AS colAlias...”有以下几点限制:
- 在SELECT中不允许再有其他表达式:不支持SELECT pageid, explode(adid_list) AS myCol...
- UDTF不能够嵌套使用:不支持SELECT explode(explode(adid_list)) AS myCol...
- 不支持GROUP BY /CLUSTER BY / DISTRIBUTE BY / SORT BY:不支持SELECT explode(adid_list) AS myCol ... GROUP BY myCol