[Hive] 08 - 内建操作符、函数(UDF)

环境

  • 宿主机:Windows 10 64_bit
  • 虚拟机:VMware pro 12
    • CentOS 7.5 64_bit(3台:1个master、2个slave)
    • Hadoop-2.6.5
    • MariaDB-5.5.60
    • Hive 1.2.2
  • ssh工具:SecureCRT 7.3

目录

0、内置运算符(Built-in Operators)

----0.0 关系运算符

----0.1 算术运算符

----0.2 逻辑运算符

----0.3 字符串运算符

----0.4 针对复杂类型的操作符

1、内置函数(Built-in Functions)

----1.0 数学函数

----1.1 集合函数

----1.2 类型转换函数

----1.3 日期函数

----1.4 条件函数

----1.5 字符串函数

----1.6 数据屏蔽函数

----1.7 Misc. 函数

----|----1.7.0 xpath

----|----1.7.1 get_json_object

2、内置聚合函数(UDAF,Built-in Aggregate Functions)

3、内置表生成函数(UDTF,Built-in Table-Generating Functions)

----3.0 使用示例

----3.1 explode

----3.2 posexplode

----3.3 json_tuple

----3.4 parse_url_tuple

4、其他

----

正文

Case-insensitive,不区分大小写。所有的Hive关键字都是不区分大小写的,也包括Hive的操作符和函数的名称。

BeelineCLI中,使用使用下方的命令去显示最近的文档:

show functions;

describe function functionName;

describe function extended functionName;

当UDF嵌套在UDF或函数中时,对于表达式缓存会有bug:

  • hive.cache.expr.evaluation=true时,(默认为true),假如一个UDF嵌套在另一个UDF或一个Hive函数中,这个UDF会给出不正确的结果。这个bug影响了0.12.00.13.00.13.1版本,不过在0.14.0修复了;
  • 这个问题跟getDisplayString方法的UDF实现有关。

0、内置运算符

0.0 关系运算符

下方的操作符将会比较传递过来的操作数、并生成一个truefalse值。

操作符操作数类型描述
a=b所有的基本类型假如表达式a等于表达式b,则为true;否则false
a==b所有的基本类型=操作符的同义词
a<=>b所有的基本类型对于非空操作数(no-null),返回跟=操作符相同的结果,但是假如两个都是null则返回true,假如它们中其中一个是null则返回falseHive 0.9.0版本
a<>b所有的基本类型假如a或b是null,则为null;假如表达式a不等于表达式b,那么则是true,否则为false
a!=b所有的基本类型<>操作符的同义词
a<b所有的基本类型若a或b是null,则为null;若表达式a小于表达式b,则为true;否则为false
a<=b所有的基本类型若a或b是null,则为null;若表达式a小于等于表达式b,则为true;否则为false
a>b所有的基本类型若a或b是null,则为null;若表达式a大于表达式b,则为true;否则为false
a>=b所有的基本类型若a或b是null,则为null;若表达式a大于等于表达式b,则为true;否则为false。可以通过not关键字来反转。Hive 0.9.0版本
a [not] between b and c所有的基本类型假如ab、或cnull,则为null;若a大于等于b且小于等于c,则为true;否则为falseHive 0.9.0版本
a is null所有类型若表达式a计算结果为null,则为true;否则为false
a is not null所有类型若表达式a计算结果为null,则为false;否则为true
a is [not] (true|false)布尔类型仅当满足条件时,则为trueHive 3.0.0+版本
注意:nullunknown,都会是false
a [not] like b字符串假如a或b是null,则为null;假如字符串a跟SQL简单的正则表达式b匹配的话,则为true;否则为false
比较是按字符进行的。b中的_可以匹配a中的任何字符;而b中的%可以匹配a中任意个字符。例如:foobarfoo计算结果为false;而foobarfoo_ _ _计算结果为truefoobarfoo%
a rlike b字符串假如a或b是null,则为null;假如a的任何子串(可能是空)匹配Java正则表达式b,则为true;否则为false。例如:foobar rlike foo将结算为true,而且foobar rlike ^f.*r$
a regexp b字符串跟rlike一样

0.1 算术运算符

下方操作符支持对操作数的各种常见算术运算。所有都会返回数字类型;假如任何操作数都是null,那么结果也是null

运算符操作数类型描述
a+b所有的数字类型得到a加上b的结果。结果的类型跟操作数的公共父级是相同的。
a-b所有的数字类型得到a减b的结果。
a*b所有的数字类型得到a乘b的结果。
a/b所有的数字类型得到a除以b的结果。
a div b整数类型取整。例如:17 div 3结果为5
a % b所有的数字类型取余
a & b所有的数字类型按位取与
a | b所有的数字类型按位取或
a ^ b所有的数字类型按位取异或
~a所有的数字类型按位取反

0.2 逻辑运算符

下方运算符支持创建逻辑表达式。它们所有都返回truefalse、或null,这取决于操作数的布尔值。null表示一个unknown标志,所以假如结果取决于unknown标志,那么结果本身就是unknown

操作符操作数类型描述
a and b布尔类型假如a和b都是true,那么结果为true,否则为false。假如a或b是null,则结果是null
a or b布尔类型假如a或b、或a和b都是true,那么结果为truefalsenull则为null,否则为false
not a布尔类型假如a是falsenull,则结果为true;否则为false
!a布尔类型not a一样
a in (val1, val2, ...)布尔类型假如a等于其中任一个值,则为trueHive 0.13+
a not in (val1, val2, ...)布尔类型假如a不等于其中任一个值,则为trueHive 0.13+
[not] exists (subquery)假如子查询至少返回一行,则为trueHive 0.13+

0.3 字符串操作符

操作符操作数类型描述
a || b字符串连接操作数(concat(a ,b)的简写)Hive 2.2.0+

0.4 针对复杂类型的操作符

复杂类型构造函数

构造函数操作数描述
map(key1, value1, key2, value2, ...)根据给定的键值对创建一个map。
struct(val1, val2, va3, ...)根据给定的字段值创建一个struct。字段名将是col1col2,…
named_struct(name1, val1, name2, val2, ...)根据给定的字段名称和值创建一个struct。Hive 0.8.0+
array(val1, val2, ...)根据给定的元素创建一个array。
create_union(tag, val1, val2, ...)根据tag参数指向的值创建一个union类型

下方操作符提供了访问复杂类型中元素的机制:

操作符操作数类型描述
a[n]a是一个array类型,n是一个int类型返回数组A中的第n个元素。第一个元素索引是0。
m[key]m是一个map<k, v>,key有k类型返回map中key对的值。
s.xs是一个struct类型返回s的x字段。

1、内置函数

在这里插入图片描述

1.0 数学函数

Hive支持下方内置数学函数;当参数为null时,大部分会返回null

返回类型名称描述
doubleround(double a)返回对a四舍五入的bigint值
doubleround(double a, int d)返回a的四舍五入、并精确到d位的值
doublebround(double a)返回a使用了half_even舍入法模式的bigint值。Hive 1.3.0+2.0.0+。也称为高斯或银行家舍入法。例如:bround(2.5)=2bround(3.5)=4
doubleround(double a, int d)指定精度为d位的银行家舍入法Hive 1.3.0+2.0.0+。例如:bround(8.25, 1)=8.2bround(8.35, 1)=8.4
bigintfloor(double a)向下取整,返回等于或小于a的最大整数
bigintceil(double a)ceiling(double a)向上取整,返回大于或等于a的最小整数
doublerand()rand(int seed)返回一个0到1内的随机数。如果指定种子seed,则会取得一个稳定的随机数序列
doubleexp(double a)exp(decimal a)自然指数,返回自然对数e的a次方。decimal是在Hive 0.13.0引入
doublein(double a)in(decimal a)返回以自然数为底的对数,a可以是小数,decimal是在Hive 0.13.0引入
doublelog10(double a)log10(decimal a)返回以10为底的a的对数,decimal是在Hive 0.13.0引入
doublelog2(double a)log2(decimal a)返回以2为底的a的对数,decimal是在Hive 0.13.0引入
doublelog(double base, double a)log(decimal base, decimal a)返回以base为底的a的对数,decimal是在Hive 0.13.0引入
doublepow(double a, double p)power(double a, double p)返回a的p次幂
doublesqrt(double a)sqrt(decimal a)返回a的平方根,decimal是在Hive 0.13.0引入
stringbin(bigint a)返回a的二进制码表示
stringhex(bigint a)hex(string a)hex(binary a)十六进制函数。如果变量是int类型,那么返回a的十六进制表示;如果变量是string类型,则返回该字符串的十六进制表示,等等。binary是在Hive 0.12.0引入
binaryunhex(string a)反转十六进制函数。返回该十六进制字符串所代码的字符串。binary是在Hive 0.12.0引入
stringconv(bigint num, int from_base, int to_base)conv(string num, int from_base, int to_base)进制转换函数,将数值num从from_base进制转化到to_base进制
doubleabs(double a)绝对值函数,返回a的绝对值
int or doublepmod(int a, int b)pmod(double a, double b)取余函数,返回正的a除以b的余数
doublesin(double a)sin(decimal a)正弦函数,返回a的正弦值,decimal是在Hive 0.13.0引入
doubleasin(double a)asin(decimal a)反正弦函数,返回a的反正弦值,decimal是在Hive 0.13.0引入
doublecos(double a)cos(decimal a)余弦函数,返回a的余弦值,decimal是在Hive 0.13.0引入
doubleacos(double a)acos(decimal a)反余弦函数,返回a的反余弦值,decimal是在Hive 0.13.0引入
doubletan(double a)tan(decimal a)正切函数,返回a的正切值,decimal是在Hive 0.13.0引入
doubleatan(double a)atan(decimal a)反正切函数,返回a的反正切值,decimal是在Hive 0.13.0引入
doubledegrees(double a)degrees(decimal a)弧度值转换角度值函数,返回弧度a的角度值,decimal是在Hive 0.13.0引入
doubleradians(double a)radians(decimal a)角度值转换成弧度值函数,返回角度a的弧度值,decimal是在Hive 0.13.0引入
int or doublepositive(int a)positive(double a)返回a
int or doublenegative(int a)negative(double a)返回a的相反数
int or doublesign(int a)sign(double a)判断数值是正数,0或负数。如果a是正数则返回1.0,是负数则返回-1.0,否则返回0.0。decimal是在Hive 0.13.0引入
doublee()返回数学常数e
doublepi()返回数学常数pi
bigintfactorial(int a)返回a的阶乘,a的有效值为0-20。Hive 1.2.0+
doublecbrt(double a)返回a的立方根。Hive 1.2.0+
int or bigintshiftleft(tinyint|smallint|int a, int b)shiftleft(bigint a, int b)返回a按位左移b位。Hive 1.2.0+
int or bigintshifright(tinyint|smallint|int a, int b)shiftright(bigint a, int b)回a按位右移b位。Hive 1.2.0+
int or bigintshiftrightunsigned(tinyint|smallint|int a, int b)shiftrightunsigned(bigint a, int b)无符号按位右移(<<<),返回a按位右移b位。Hive 1.2.0+
Tgreatest(T v1, T v2, ...)返回值列表的最大值。Hive 1.1.0+
Tleast(T v1, T v2, ...)返回值列表的最小值。Hive 1.1.0+
intwidth_bucket(numeric expr, numeric min_value, numeric max_value, INT num_buckets)Hive 3.0.0+

1.1 集合函数

返回类型名称描述
intsize(Map<K.V>)返回map的元素数量
intsize(Array<T>)返回array的元素数量
array<K>map_keys(Map<K.V>)返回一个包含输入map的key的无序map
array<V>map_values(Map<K.V>)返回一个包含输入map的value的无序map
booleanarray_contains(Array<T>, value)假如array包含value则返回true
array<t>sort_array(Array<T>)按照array元素的自然顺序对输入array按升序排序并返回。Hive 0.9.0+

实例:

hive> select 11 % 2;
OK
1
Time taken: 1.364 seconds, Fetched: 1 row(s)
hive> select ceil(28.0/6.999999999999999999999);
OK
4
Time taken: 0.136 seconds, Fetched: 1 row(s)
hive> select round(6.8 % 2, 2);
OK
0.8
Time taken: 0.17 seconds, Fetched: 1 row(s)

1.2 类型转换函数

返回类型名称描述
binarybinary(string|binary)将参数强制转换为二进制
typecast(expr as <type>)将表达式expr的结果转换为type类型。例如:cast('1' as BIGINT),将把字符串1转换为整数1。假如转换失败,则返回null。对于一个非空字符串,cast(expr as boolean)将返回true

1.3 日期函数

返回类型名称描述
stringfrom_unixtime(bigint unixtime[,string format])UNIX时间戳转日期函数from_unixtime。即转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式
bigintunix_timestamp()获取当前UNIX时间戳函数unix_timestamp。即获得当前时区的UNIX时间戳
bigintunix_timestamp(string date)日期转UNIX时间戳函数unix_timestamp。转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。
bigintunix_timestamp(string date, string pattern)指定格式日期转UNIX时间戳函数unix_timestamp。 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。
Hive 2.1.0之前是:string2.1.0之后是:dateto_date(string timestamp)日期时间转日期函数to_date。返回日期时间字段中的日期部分。
intyear(string date)日期转年函数year。返回日期中的年。
intquarter(date/timestamp/string)Hive 1.3.0+。返回日期、时间戳或字符串在1到4范围内的一个季度
intmonth(string date)日期转月函数month。返回日期中的月份。
intday(string date) dayofmonth(date)日期转天函数day。返回日期中的天
inthour(string date)日期转小时函数hour。返回日期中的小时
intminute(string date)日期转分钟函数minute。返回日期中的分钟
intsecond(string date)日期转秒函数second。返回日期中的秒
intweekofyear(string date)日期转周函数weekofyear。返回日期在当前的周数
intextract(field from source)Hive 2.2.0+。从源检索像天、小时等字段。源必须是一个日期、时间戳、或者可以转换为日期或时间戳的间隔或字符串。支持的字段包括:日、日、时、分、月、季度、秒、周、年。
intdatediff(string enddate, string startdate)日期比较函数datediff。返回结束日期减去开始日期的天数
Hive 2.1.0之前是:string2.1.0之后是:datedate_add(date/timestamp/string startdate, tinyint/smallint/int days)日期增加函数date_add。返回开始日期startdate增加days天后的日期
Hive 2.1.0之前是:string2.1.0之后是:datedate_sub(date/timestamp/string startdate, tinyint/smallint/int days)日期减少函数date_sub。返回开始日期startdate减少days天后的日期
timestampfrom_utc_timestamp({any primitive type} ts, string timezone)Hive 0.8.0+。将UTC中的时间戳转换为给定时区
timestampto_utc_timestamp({any primitive type} ts, string timezone)Hive 0.8.0+。将给定时区中的时间戳转换为UTC
datecurrent_dateHive 1.2.0+。返回查询计算开始时的当前日期
timestampcurrent_timestampHive 1.2.0+。返回查询计算开始时的当前时间戳
stringadd_months(string start_date, int num_months, output_date_format)按指定格式返回指定日期增加几个月后的日期
stringlast_day(string date)返回月份中的最后一天
stringnext_day(string start_date, string day_of_week)返回指定日期下周的指定周几
stringtrunc(string date, string format)返回日期date月份的第一天/年中的第一天日期
doublemonths_between(date1, date2)返回date1到date2之间的月数
stringdate_format(date/timestamp/string ts, string fmt)返回指定日期格式

1.4 条件函数

返回类型名称描述
Tif(boolean testCondition, T valueTrue, T valueFalseOrNull)当testCondition为true时,返回valueTrue;否则返回alueFalseOrNull
T``
booleanisnull( a )假如a是null,则返回true;否则false
booleanisnotnull ( a )假如a是null,则返回false;否则true
Tnvl(T value, T default_value)假如value是null,则返回默认值;否则返回value。HIve 0.11+
Tcoalesce(T v1, T v2, ...)null则返回第一个v;假如所有v是null则返回null
Tcase a when b then c [when d then e]* [else f] end当a=b,则返回c;当a=d,则返回e;其他返回f
Tcase when a then b [when c then d]* [else e] end当a=true,则返回b;当c=true,则返回d;其他返回e
Tnullif( a, b )假如a=b,则返回null;其他返回a。Hive 2.3.0+
voidassert_true(boolean condition)假如condition不为true,则抛出异常,否则返回null。Hive 0.8.0+

实例:

hive (test)> select from_unixtime(unix_timestamp(), 'yyyyMMdd');
OK
20190619

1.5 字符串函数

返回类型名称描述
intascii(string str)返回字符串str第一个字符的ascii码
stringbase64(binary bin)将参数从二进制转换为base64字符串
intcharacter_length(string str)Hive 2.2.0+。返回str中包含的utf-8字符数。char_length是这个函数的简写
stringchr(bigint|double A)返回等价于a的二进制的ascii码字符。Hive 1.3.0+Hive 2.1.0+
stringconcat(string|binary A, string|binary B...)返回输入字符串连接后的结果,支持任意个输入字符串
stringconcat_ws(string SEP, array<string>)
stringconcat_ws(string SEP, string A, string B...)返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
array<struct<string,double>>context_ngrams(array<array<string>>, array<string>, int K, int pf)
stringdecode(binary bin, string charset)Hive 0.12.0+。使用提供的字符集('US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16')将第一个参数解码为一个字符串。假如参数为null,那么结果也是null
binaryencode(string src, string charset)Hive 0.12.0+。使用提供的字符集('US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16')将第一个参数编码为一个二进制
stringelt(N int,str1 string,str2 string,str3 string,...)返回指定索引号的字符串。例如:elt(2,'hello','world')返回world。假如N小于1或大于索引号数字,则返回null
intfield(val T,val1 T,val2 T,val3 T,...)返回val的索引。若找不到则返回0。
intfind_in_set(string str, string strList)返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0
stringformat_number(number x, int d)将数值X转换成"#,###,###.##"格式字符串,并保留d位小数,如果d为0,将进行四舍五入且不保留小数
stringget_json_object(string json_string, string path)解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
booleanin_file(string str, string filename)假如str以整行出现在文件中,则返回true
stringinitcap(string A)Hive 1.1.0+。返回字符串,每个单词的第一个字母为大写,所有其他字母为小写。单词由空格分隔。
intinstr(string str, string substr)查找字符串str中子字符串substr出现的位置,如果查找失败将返回0,如果任一参数为Null将返回null,注意位置为从1开始的
intlength(string A)返回字符串A的长度
intlocate(string substr, string str[, int pos])查找字符串str中子字符串substr出现的位置,如果查找失败将返回0,如果任一参数为Null将返回null,注意位置为从1开始的
stringlower(string A) lcase(string A)返回字符串A的小写格式
stringlpad(string str, int len, string pad)将str进行用pad进行左补足到len位
stringltrim(string A)去除字符串左边的空格
array<struct<string,double>>ngrams(array<array<string>>, int N, int K, int pf)
intoctet_length(string str)
stringparse_url(string urlString, string partToExtract [, string keyToExtract])URL解析函数,返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO
stringprintf(String format, Obj... args)
stringquote(String text)
stringregexp_extract(string subject, string pattern, int index)正则表达式解析函数,将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符
stringregexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)正则表达式替换函数,将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
stringrepeat(string str, int n)返回重复n次后的str字符串
stringreplace(string A, string OLD, string NEW)
stringreverse(string A)返回字符串A的反转结果
stringrpad(string str, int len, string pad)将str进行用pad进行右补足到len位
stringrtrim(string A)去除字符串右边的空格
array<array<string>>sentences(string str, string lang, string locale)
stringsoundex(string A)
arrayspace(int n)返回长度为n的空字符串
arraysplit(string str, string pat)按照pat字符串分割str,会返回分割后的字符串数组
map<string,string>str_to_map(text[, delimiter1, delimiter2])
stringsubstr(string|binary A, int start) substring(string|binary A, int start)返回字符串A从start位置到结尾的字符串
stringsubstr(string|binary A, int start, int len) substring(string|binary A, int start, int len)返回字符串A从start位置开始,长度为len的字符串
stringsubstring_index(string A, string delim, int count)
stringtranslate(string|char|varchar input, string|char|varchar from, string|char|varchar to)
stringtrim(string A)去除字符串两边的空格
binaryunbase64(string str)
stringupper(string A) ucase(string A)返回字符串A的大写格式

实例:

hive (test)> select elt(2,'hello','world');
OK
world
Time taken: 0.134 seconds, Fetched: 1 row(s)
hive (test)> select elt(3,'hello','world');
OK
NULL

1.6 数据屏蔽函数

返回类型名称描述
stringmask(string str[, string upper[, string lower[, string number]]])Hive 2.1.0+。返回str的屏蔽版本。默认情况下,大写字母转换为X,小写字母转换为x,数字转换为n。例如:mask("abcd-EFGH-8765-4321")将返回xxxx-XXXX-nnnn-nnnn
stringmask_first_n(string str[, int n])Hive 2.1.0+。返回前n个值被屏蔽的str的屏蔽版本
stringmask_last_n(string str[, int n])Hive 2.1.0+。返回最后n个值被屏蔽的str的屏蔽版本
stringmask_show_first_n(string str[, int n])Hive 2.1.0+。返回str的屏蔽版本,显示未屏蔽的前n个字符
stringmask_show_last_n(string str[, int n])Hive 2.1.0+。返回str的屏蔽版本,显示未屏蔽的最后n个字符
stringmask_hash(string|char|varchar str)Hive 2.1.0+。返回基于str的哈希值

1.7 Misc. 函数

返回类型名称描述
variesjava_method(class, method[, arg1[, arg2..]])reflect的同义词。Hive 0.9.0+
variesreflect(class, method[, arg1[, arg2..]])通过使用反射匹配参数签名来调用Java方法。Hive 0.7.0+
inthash(a1[, a2...])返回参数的哈希值。Hive 0.4+
stringcurrent_user()从配置的验证管理器返回当前用户名。Hive 1.2.0+
stringlogged_in_user()从会话状态返回当前用户名 Hive 2.2.0+
stringcurrent_database()返回当前数据库名称。Hive 0.13.0+
stringmd5(string/binary)计算字符串或二进制文件的MD5 128位校验和。Hive 1.3.0
stringsha1(string/binary)、sha(string/binary)计算字符串或二进制的SHA-1摘要,并将值作为十六进制字符串返回。Hive 1.3.0+
bigintcrc32(string/binary)为字符串或二进制参数计算循环冗余校验值并返回bigint值。Hive 1.3.0+
stringsha2(string/binary, int)计算SHA-2散列函数族 (SHA-224, SHA-256, SHA-384, and SHA-512)。Hive 1.3.0+
binaryaes_encrypt(input string/binary, key string/binary)使用AES加密输入。Hive 1.3.0+
binaryaes_decrypt(input binary, key string/binary)使用AES解密输入。Hive 1.3.0+
stringversion()返回Hive的版本。Hive 2.1.0+
bigintsurrogate_key([write_id_bits, task_id_bits])在表中输入数据时自动为行生成数字ID。只能用作ACID的默认值或只插入表。

1.7.0 xpath

下方函数都描述在LanguageManual XPathUDF
xpath, xpath_short, xpath_int, xpath_long, xpath_float, xpath_double, xpath_number, xpath_string

1.7.1 get_json_object

支持限制版本的JSONPath:

  • $ root对象
  • . 子操作符
  • [] array的下标运算符
  • * []的通配符

不支持的语法:

  • 零长度的字符串作为key
  • .. 递归下降
  • @当前对象/元素
  • ()脚本表达式
  • ?()过滤(脚本)表达式
  • [,] 联合运算符
  • [start:end.step]array切片操作符

实例:src_json表是一个单列、单行的表

{"store":
  {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
   "bicycle":{"price":19.95,"color":"red"}
  },
 "email":"amy@only_for_json_udf_test.net",
 "owner":"amy"
}

使用下方的查询,可提取json对象中的字段:

hive> SELECT get_json_object(src_json.json, '$.owner') FROM src_json;
amy
 
hive> SELECT get_json_object(src_json.json, '$.store.fruit\[0]') FROM src_json;
{"weight":8,"type":"apple"}
 
hive> SELECT get_json_object(src_json.json, '$.non_exist_key') FROM src_json;
NULL

2、内置聚合函数

返回类型名称描述
bigintcount(*)count(expr)count(DISTINCT expr[, expr...])个数统计函数。count(*)计检索出的行的个数,包括NULL值的行。count(expr)返回指定字段的非空值的个数。count(DISTINCT expr[, expr...])返回指定字段的不同的非空值的个数
doublesum(col)sum(DISTINCT col)sum(col)统计结果集中col的相加的结果;sum(DISTINCT col)统计结果中col不同值相加的结果
doubleavg(col)avg(distinct col)avg(col)统计结果集中col的平均值;avg(distinct col)统计结果中col不同值相加的平均值
doublemin(col)统计结果集中col字段的最小值
doublemax(col)统计结果集中col字段的最大值
doublevariance(col)var_pop(col)非空集合总体变量函数,统计结果集中col非空集合的总体变量(忽略null)
doublevar_samp(col)非空集合样本变量函数,统计结果集中col非空集合的样本变量(忽略null)
doublestddev_pop(col)该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与var_pop()函数的平方根相同
doublestddev_samp(col)该函数计算样本标准偏离
doublecovar_pop(col1, col2)返回组中一对数值列的总体协方差
doublecovar_samp(col1, col2)返回组中一对数值列的样本协方差
doublecorr(col1, col2)返回组中一对数值列的Pearson相关系数
doublepercentile(bigint col, p)中位数函数,求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型
array<double>percentile(bigint col, array(p1 [, p2]...))中位数函数,功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array,其中为对应的百分位数。
doublepercentile_approx(double col, p [, B])近似中位数函数,求近似的第pth个百分位数,p必须介于0和1之间,返回类型为double,但是col字段支持浮点类型。参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数
array<double>percentile_approx(double col, array(p1 [, p2]...) [, B])功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array,其中为对应的百分位数。
doubleregr_avgx(independent, dependent)Hive 2.2.0,相当于avg(dependent)
doubleregr_avgy(independent, dependent)Hive 2.2.0,相当于avg(dependent)
doubleregr_count(independent, dependent)Hive 2.2.0,返回用于适合线性回归线的non-null对的数目
doubleregr_intercept(independent, dependent)Hive 2.2.0,返回线性回归线的y-intercept。例如:b的值依赖于= a*,而不依赖于+ b
doubleregr_r2(independent, dependent)Hive 2.2.0,返回回归的确定系数
doubleregr_slope(independent, dependent)Hive 2.2.0,返回线性回归线的坡度
doubleregr_sxx(independent, dependent)Hive 2.2.0,相当于regr_count(independent, dependent) * var_pop(dependent)
doubleregr_sxy(independent, dependent)Hive 2.2.0,相当于regr_count(independent, dependent) * covar_pop(independent, dependent)
doubleregr_syy(independent, dependent)Hive 2.2.0,相当于regr_count(independent, dependent) * var_pop(independent)
array<struct {'x','y'}>histogram_numeric(col, b)以b为基准计算col的直方图信息
arraycollect_set(col)返回一组消除了重复元素的对象
arraycollect_list(col)返回具有重复项的对象列表。Hive 0.13.0+
integerntile(integer x)将一个有序分区划分为x组,称为bucket,并为分区中的每一行分配一个bucket编号。Hive 0.11.0+

3、内置表生成函数

普通的用户定义函数(UDF),如concat(),接受一个输入行并输出一个输出行。相反,表生成函数将单个输入行转换为多个输出行。

row-set columns types名称描述
Texplode(ARRAY<T> a)数组转成多行函数
T_key,T_valueexplode(MAP<Tkey,Tvalue> m)map中每个key-value对,生成一行,key为一列,value为一列
int,Tposexplode(ARRAY<T> a)使用int类型的附加位置列将数组分解为多行
T1,...,Tninline(ARRAY<STRUCT<f1:T1,...,fn:Tn>> a)将结构数组分解为多行
T1,...,Tn/rstack(int r,T1 V1,...,Tn/r Vn)将n个值v1,…,vn分解为r行
string1,...,stringnjson_tuple(string jsonStr,string k1,...,string kn)获取JSON字符串和一组n个键,并返回一个n值的元组。
string 1,...,stringnparse_url_tuple(string urlStr,string p1,...,string pn)获取url字符串和一组n个url部分,并返回n个值的元组。

实例1:explode (array)

hive (test)> select explode(array('A','B','C'));
OK
A
B
C
Time taken: 0.37 seconds, Fetched: 3 row(s)
hive (test)> select explode(array('A','B','C')) as col;
OK
A
B
C
Time taken: 0.115 seconds, Fetched: 3 row(s)
hive (test)> select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf;
OK
A
B
C
Time taken: 3.067 seconds, Fetched: 3 row(s)
hive (test)> select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf as col;
OK
A
B
C
Time taken: 0.106 seconds, Fetched: 3 row(s)

实例2:explode (map)

hive (test)> select explode(map('A',10,'B',20,'C',30));
OK
A       10
B       20
C       30
Time taken: 0.153 seconds, Fetched: 3 row(s)
hive (test)> select explode(map('A',10,'B',20,'C',30)) as (key,value);
OK
A       10
B       20
C       30
Time taken: 0.108 seconds, Fetched: 3 row(s)
hive (test)> select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf;
OK
A       10
B       20
C       30
Time taken: 0.529 seconds, Fetched: 3 row(s)
hive (test)> select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf as key,value;
OK
A       10
B       20
C       30
Time taken: 0.237 seconds, Fetched: 3 row(s)

实例3:posexplode (array)

select posexplode(array('A','B','C'));
select posexplode(array('A','B','C')) as (pos,val);
select tf.* from (select 0) t lateral view posexplode(array('A','B','C')) tf;
select tf.* from (select 0) t lateral view posexplode(array('A','B','C')) tf as pos,val;

实例4:inline (array of structs)

select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02')));
select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) as (col1,col2,col3);
select tf.* from (select 0) t lateral view inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) tf;
select tf.* from (select 0) t lateral view inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) tf as col1,col2,col3;

实例5:stack (values)

select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01');
select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') as (col0,col1,col2);
select tf.* from (select 0) t lateral view stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') tf;
select tf.* from (select 0) t lateral view stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') tf as col0,col1,col2;

使用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是不支持的。

4、其他

参考

参考LanguageManual UDF-Hive Operators and User-Defined Functions (UDFs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值