配置单元运算符和用户定义的函数(UDF)

Case-insensitive

所有 Hive 关键字都不区分大小写,包括 Hive 运算符和函数的名称。

BeelineCLI中,使用以下命令显示最新文档:

SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
DESCRIBE FUNCTION EXTENDED <function_name>;

Bug for expression caching when UDF nested in UDF or function

如果hive.cache.expr.evaluation设置为 true(默认设置),则如果将其嵌套在另一个 UDF 或 Hive 函数中,则 UDF 会给出错误的结果。此错误影响版本 0.12.0、0.13.0 和 0.13.1. 版本 0.14.0 修复了该错误(HIVE-7314)。

该问题与 Hive 用户邮件列表中discussed的 UDF 对 getDisplayString 方法的实现有关。

Built-in Operators

Operators Precedences

ExampleOperatorsDescription
A [B],A.标识符bracket_op([]), dot(.)元素 selectors,点
-A一元(),一元(-),一元(~)一元前缀运算符
一个 IS [NOT](NULLTRUEFALSE)IS NULL,IS NOT NULL,...unary suffix
A ^ Bbitwise xor(^)bitwise xor
A * B星号(*),分度(/),mod(%),div(DIV)multiplicative operators
plus(+), minus(-)additive operators
Astring concatenate(||)string concatenate
A&Bbitwise and(&)bitwise and
Abitwise or(|)bitwise or

Relational Operators

以下运算符比较传递的操作数,并根据操作数之间的比较是否成立来生成 TRUE 或 FALSE 值。

OperatorOperand typesDescription
A = B所有原始类型如果表达式 A 等于表达式 B,则为 TRUE,否则为 FALSE。
A == B所有原始类型=运算符的同义词。
A<=> B所有原始类型对于非空操作数,使用 EQUAL(=)运算符返回相同的结果,但是如果两个均为 NULL,则返回 TRUE,如果其中之一为 NULL,则返回 FALSE。 (从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。
B 和 C 之间的[否]所有原始类型如果 A,B 或 C 为 NULL,则为 NULL;如果 A 大于或等于 B,而 A 小于或等于 C,则为 TRUE,否则为 FALSE。可以使用 NOT 关键字将其反转。 (从0.9.0版本开始。)
A IS NULLAll types如果表达式 A 的计算结果为 NULL,则为 TRUE,否则为 FALSE。
一个不为空All types如果表达式 A 的计算结果为 NULL,则为 FALSE,否则为 TRUE。
是[否](TRUEFALSE)Boolean types仅当 A 满足条件时评估为 TRUE。 (因为:3.0.0)


注意:NULL 为 UNKNOWN,因此(UNKNOWN 为 TRUE)和(UNKNOWN IS 为 FALSE)都将评估为 FALSE。
| A [NOT]如果 B 或 strings | NULL 如果 A 或 B 为 NULL,则为 TRUE,如果字符串 A 与 SQL 简单正则表达式 B 匹配,则为 FALSE。逐个字符进行比较。 B 中的字符匹配 A 中的任何字符(类似于 posix 正则表达式中的.),而 B 中的%字符匹配 A 中任意数目的字符(类似于 posix 正则表达式中的.)。例如,“ foobar”之类的“ foobar”评估为 FALSE,而诸如“ foo”之类的“ foobar”评估为 TRUE,“ foobar”之类的评估为“ foo%”。
| A RLIKE B | strings | NULL,如果 A 或 B 为 NULL,则为 TRUE,如果 A 的任何子字符串(可能为空)与 Java 正则表达式 B 匹配,否则为 FALSE。例如,'foobar'RLIKE'foo'的计算结果为 TRUE,'foobar'RLIKE'^ f.
r $'也是如此。
| A REGEXP B |字符串|与 RLIKE 相同。|

Arithmetic Operators

以下运算符支持对操作数的各种常见算术运算。所有返回 Numbers 类型;如果任何操作数为 NULL,则结果也为 NULL。

OperatorOperand typesDescription
所有数字类型给出将 A 和 B 相加的结果。结果的类型与操作数类型的公共父对象(在类型层次结构中)相同。例如,由于每个整数都是浮点数,因此 float 是整数的包含类型,因此浮点数和 int 上的运算符将导致浮点数。
A-B所有数字类型给出从 A 减去 B 的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。
A * B所有数字类型给出将 A 和 B 相乘的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。请注意,如果乘法导致溢出,则必须将其中一个运算符转换为类型层次结构中较高的类型。
A/B所有数字类型给出将 A 除以 B 的结果。在大多数情况下,该结果为双精度类型。当 A 和 B 均为整数时,结果为双精度类型,除非hive.compat配置参数设置为“ 0.13”或“ latest”,在这种情况下,结果为十进制类型。
A DIV BInteger types给出将 A 除以 B 所得的整数部分。例如 17 div 3 得出 5.
A%B所有数字类型给出 A 除以 B 所得的提示。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。
A&B所有数字类型给出 A 和 B 的按位与的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。
A所有数字类型给出 A 和 B 的按位或的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。
A ^ B所有数字类型给出 A 和 B 的按位 XOR 结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。
~A所有数字类型给出 A 的按位 NOT 的结果。结果的类型与 A 的类型相同。

Logical Operators

以下运算符为创建逻辑表达式提供支持。它们都根据操作数的布尔值返回布尔 TRUE,FALSE 或 NULL。 NULL 表现为“未知”标志,因此,如果结果取决于未知状态,则结果本身是未知的。

OperatorOperand typesDescription
A 和 Bboolean如果 A 和 B 均为 TRUE,则为 TRUE,否则为 FALSE。如果 A 或 B 为 NULL,则为 NULL。
A 或 Bboolean如果 A 或 B 或两者均为 TRUE,则为 TRUE,否则为 FALSE 或 NULL 为 NULL。
NOT Aboolean如果 A 为 FALSE,则为 TRUE;如果 A 为 NULL,则为 NULL。否则为 FALSE。
! Aboolean与 NOT A 相同。
A IN(val1,val2,...)boolean如果 A 等于任何值,则为 TRUE。从 Hive 0.13 开始,IN 语句中支持subqueries
一个非 Importing(val1,val2,...)boolean如果 A 不等于任何值,则为 TRUE。从 Hive 0.13 开始,NOT IN 语句支持subqueries
[NOT] EXISTS(子查询)如果子查询返回至少一行,则为 TRUE。从Hive 0.13开始受支持。

String Operators

OperatorOperand typesDescription
Astrings连接操作数-concat(A,B)的简写。从Hive 2.2.0开始受支持。

复杂类型的构造函数

以下函数构造复杂类型的实例。

Constructor FunctionOperandsDescription
map(key1,value1,key2,value2,...)使用给定的键/值对创建一个 Map。
struct(val1,val2,val3,...)用给定的字段值创建一个结构。结构字段名称将为 col1,col2,...。
named_struct(名称 1,名称 1,名称 2,名称 2,...)用给定的字段名称和值创建一个结构。 (从 Hive 0.8.0开始。)
array(val1,val2,...)用给定的元素创建一个数组。
create_union(标签,val1,val2,...)用 tag 参数指向的值创建一个联合类型。

复杂类型上的运算符

以下运算符提供了访问复杂类型中的元素的机制。

OperatorOperand typesDescription
A[n]A 是一个数组,n 是一个整数返回数组 A 中的第 n 个元素。第一个元素的索引为 0.例如,如果 A 是包含['foo','bar']的数组,则 A [0]返回'foo',而 A [1]返回'酒吧'。
M[key]M 是 Map\ <K, V>,并且密钥的类型为 K返回与 Map 中的键对应的值。例如,如果 M 是包含\ {'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}的 Map,则 M ['all']返回'foobar'。
S.xS 是一个结构返回 S 的 x 字段。例如对于 foobar{int foo, int bar}结构,foobar.foo 返回存储在 foo 字段中的整数。

Built-in Functions

Mathematical Functions

Hive 支持以下内置 math 函数;当参数为 NULL 时,大多数返回 NULL:

Return TypeName (Signature)Description
DOUBLEround(DOUBLE a)返回舍入的BIGINTa
DOUBLE舍入(DOUBLE a,INT d)返回a舍入到d小数位。
DOUBLEbround(DOUBLE a)使用 HALF_EVEN 舍入模式(从Hive1.3.0,2.0.0开始)返回舍入的 BIGINT 值a。也称为高斯舍入或银行家舍入。例如:bround(2.5)= 2,bround(3.5)= 4.
DOUBLE圆角(DOUBLE a,INT d)使用 HALF_EVEN 舍入模式(从Hive1.3.0,2.0.0开始),将a舍入到d小数位。例如:bround(8.25,1)= 8.2,bround(8.35,1)= 8.4.
BIGINTfloor(DOUBLE a)返回等于或小于a的最大BIGINT值。
BIGINT天花板(DOUBLE A),天花板(DOUBLE A)返回等于或大于a的最小 BIGINT 值。
DOUBLErand(),rand(INT 种子)返回从 0 到 1 均匀分布的随机数(逐行变化)。指定种子将确保所生成的随机数序列具有确定性。
DOUBLEexp(DOUBLE a),exp(DECIMAL a)返回ea,其中e是自然对数的底数。 Hive 0.13.0中添加了十进制版本。
DOUBLEln(DOUBLE a),ln(DECIMAL a)返回参数a的自然对数。 Hive 0.13.0中添加了十进制版本。
DOUBLElog10(DOUBLE a),log10(DECIMAL a)返回参数a的以 10 为底的对数。 Hive 0.13.0中添加了十进制版本。
DOUBLElog2(DOUBLE a),log2(DECIMAL a)返回参数a的以 2 为底的对数。 Hive 0.13.0中添加了十进制版本。
DOUBLE日志(DOUBLE base,DOUBLE a)

log(DECIMAL base,DECIMAL a)
返回自变量a的底数base对数。 Hive 0.13.0中添加了十进制版本。
DOUBLEpow(DOUBLE a,DOUBLE p),功率(DOUBLE a,DOUBLE p)返回ap
DOUBLEsqrt(DOUBLE a),sqrt(DECIMAL a)返回a的平方根。 Hive 0.13.0中添加了十进制版本。
STRINGbin(BIGINT a)以二进制格式返回数字(请参见http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_bin)。
STRINGhex(BIGINT a)hex(STRING a)hex(BINARY a)如果参数是INTbinary,则hex以十六进制格式将数字作为STRING返回。否则,如果数字为STRING,则它将每个字符转换为其十六进制表示形式,并返回结果STRING。 (请参阅 Hive 0.12.0http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_hexBINARY版本。)
BINARYunhex(STRING a)十六进制的逆。将每对字符解释为十六进制数字,并转换为数字的字节表示形式。 (自 Hive 0.12.0起的BINARY版本,用于返回字符串。)
STRINGconv(BIGINT num,INT from_base,INT to_base),conv(STRING num,INT from_base,INT to_base)将数字从给定的基数转换为另一个基数(请参见http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv)。
DOUBLEabs(DOUBLE a)返回绝对值。
INT 或 DOUBLEpmod(INT a,INT b),pmod(DOUBLE a,DOUBLE b)返回a mod b的正值。
DOUBLEsin(DOUBLE a),sin(DECIMAL a)返回a的正弦(a以弧度表示)。 Hive 0.13.0中添加了十进制版本。
DOUBLEasin(DOUBLE a),asin(DECIMAL a)如果-1 <= a <= 1,则返回a的反正弦值,否则返回 NULL。 Hive 0.13.0中添加了十进制版本。
DOUBLEcos(DOUBLE a),cos(DECIMAL a)返回a的余弦(a以弧度表示)。 Hive 0.13.0中添加了十进制版本。
DOUBLEacos(DOUBLE a),acos(DECIMAL a)如果-1 <= a <= 1,则返回a的反余弦值,否则返回 NULL。 Hive 0.13.0中添加了十进制版本。
DOUBLEtan(DOUBLE a),tan(DECIMAL a)返回a的切线(a以弧度表示)。 Hive 0.13.0中添加了十进制版本。
DOUBLEatan(DOUBLE a),atan(DECIMAL a)返回a的反正切。 Hive 0.13.0中添加了十进制版本。
DOUBLEdegrees(DOUBLE a),degrees(DECIMAL a)a的值从弧度转换为度数。 Hive 0.13.0中添加了十进制版本。
DOUBLE弧度(DOUBLE a),弧度(DOUBLE a)a的值从度转换为弧度。 Hive 0.13.0中添加了十进制版本。
INT 或 DOUBLE正(INT a),正(DOUBLE a)返回a
INT 或 DOUBLE负数(INT a),负数(DOUBLE a)返回-a
DOUBLE 或 INTsign(DOUBLE a),sign(DECIMAL a)a的符号返回为'1.0'(如果a为正)或'-1.0'(如果a为负),否则为'0.0'。十进制版本返回 INT 而不是 DOUBLE。 Hive 0.13.0中添加了十进制版本。
DOUBLEe()返回e的值。
DOUBLEpi()返回pi的值。
BIGINTfactorial(INT a)返回a的阶乘(从 Hive 1.2.0起)。有效a为[0..20]。
DOUBLEcbrt(DOUBLE a)返回a double 值的立方根(从 Hive 1.2.0开始)。
INT
BIGINT
向左移(TINYINTSMALLINTINT a,INT b)
shiftleft(BIGINT a,INT b)
按位左移(从 Hive 1.2.0开始)。将a b位置向左移动。
为 tinyint,smallint 和 int a返回 int。为 bigint a返回 bigint。
INT
BIGINT
shiftright(TINYINTSMALLINTINT a,INT b)
shiftright(BIGINT a,INT b)
按位右移(从 Hive 1.2.0开始)。向右移动a b位置。
为 tinyint,smallint 和 int a返回 int。为 bigint a返回 bigint。
INT
BIGINT
shiftrightunsigned(TINYINTSMALLINTINT a,INT b),
shiftrightunsigned(BIGINT a,INT b)
按位无符号右移(从 Hive 1.2.0开始)。向右移动a b位置。
为 tinyint,smallint 和 int a返回 int。为 bigint a返回 bigint。
Tgreatest(T v1,T v2,...)返回值列表的最大值(从 Hive 1.1.0开始)。固定为当一个或多个参数为 NULL 且严格类型限制放宽时返回 NULL,与“>”运算符一致(从 Hive 2.0.0开始)。
Tleast(T v1,T v2,...)返回值列表中的最小值(从 Hive 1.1.0开始)。固定为当一个或多个参数为 NULL 并放宽严格的类型限制(与 Hive 2.0.0一致)时,返回严格的类型限制,以返回 NULL。
INTwidth_bucket(NUMERIC expr,NUMERIC min_value,NUMERIC max_value,INT num_buckets)通过将 exprMap 到第 i 个大小相等的存储桶中,返回 0 到 num_buckets 1 之间的整数。通过将[min_value,max_value]划分为大小相等的区域来制作存储桶。如果 expr< min_value, return 1, if expr > max_value 返回 num_buckets 1.请参见https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions214.htm(从 Hive 3.0.0 开始)

小数数据类型的 math 函数和运算符

Version

Hive 0.11.0(HIVE-2693)中引入了十进制数据类型。

所有常规算术运算符(例如,-,*,/)和相关的 mathUDF(Floor,Ceil,Round 等)都已更新为处理十进制类型。有关受支持的 UDF 的列表,请参见Hive 数据类型中的Mathematical UDFs

Collection Functions

Hive 支持以下内置收集功能:

Return TypeName(Signature)Description
intsize(Map<K.V>)返回 Map 类型中的元素数。
intsize(Array<T>)返回数组类型中的元素数。
array<K>map_keys(Map<K.V>)返回包含 ImportingMap 键的无序数组。
array<V>map_values(Map<K.V>)返回包含 ImportingMap 值的无序数组。
booleanarray_contains(Array<T>, value)如果数组包含值,则返回 TRUE。
array<t>sort_array(Array<T>)根据数组元素的自然 Sequences 以升序对 Importing 数组进行排序,然后将其返回(从版本0.9.0开始)。

类型转换功能

Hive 支持以下类型转换功能:

Return TypeName(Signature)Description
binarybinary(string|binary)将参数转换为二进制。
期望“ =”跟随“类型”强制转换(expr 为 )将表达式 expr 的结果转换为\ 。例如,cast('1'as BIGINT)会将字符串'1'转换为其整数表示。如果转换不成功,则返回 null。如果 cast(expr 为 boolean),则 Hive 对于非空字符串返回 true。

Date Functions

Hive 支持以下内置日期功能:

Return TypeName(Signature)Description
stringfrom_unixtime(bigint unixtime[, string format])将 unix 纪元(1970-01-01 00:00:00 UTC)的秒数转换为一个字符串,该字符串表示当前系统时区中该 Moment 的时间戳,格式为“ 1970-01-01 00:00: 00”。
bigintunix_timestamp()以秒为单位获取当前的 Unix 时间戳。此函数不是确定性的,其值在查询执行范围内也不是固定的,因此会阻止对查询的适当优化-自 2.0 版以来已弃用此函数,而推荐使用 CURRENT_TIMESTAMP 常量。
bigintunix_timestamp(string date)使用默认时区和默认语言环境将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换为 Unix 时间戳(以秒为单位),如果失败,则返回 0:unix_timestamp('2009-03-20 11:30:01')= 1237573801
bigintunix_timestamp(字符串日期,字符串模式)将具有给定模式(请参见 [http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html])的时间字符串转换为 Unix 时间戳(以秒为单位),如果失败,则返回 0:unix_timestamp('2009-03-20','yyyy-MM-dd')= 1237532400.
* 2.1.0 之前的版本:*字符串

* 2.1.0 on:* date
to_date(字符串时间戳记)返回时间戳记字符串的日期部分(Hive 2.1.0 之前):to_date(“ 1970-01-01 00:00:00”)=“ 1970 -01-01”。从 Hive 2.1.0 开始,返回日期对象。


在 Hive 2.1.0(HIVE-13248)之前,返回类型为 String,因为创建方法时不存在 Date 类型。
| int | year(字符串日期)|返回日期或时间戳字符串的年份部分:year(“ 1970-01-01 00:00:00”)= 1970,year(“ 1970-01-01”)= 1970.|
| int | quarter(date/timestamp/string)|返回日期,时间戳或字符串在 1 到 4 范围内的一年的四分之一(从 Hive 1.3.0开始)。示例:quarter('2015-04-08')= 2 |
| int | month(string date)|返回日期或时间戳记字符串的月份部分:month(“ 1970-11-01 00:00:00”)= 11,month(“ 1970-11-01”)= 11 |
| int | day(string date)dayofmonth(date)|返回日期或时间戳记字符串的 day 部分:day(“ 1970-11-01 00:00:00”)= 1,day(“ 1970-11- 01“)= 1. |
| int | hour(字符串日期)|返回时间戳的小时:hour('2009-07-30 12:58:59')= 12,hour('12:58:59')= 12.
| int | minute(字符串日期)|返回时间戳记的分钟。
| int | second(字符串日期)|返回时间戳的秒。
| int | weekofyear(字符串日期)|返回时间戳字符串的星期数:weekofyear(“ 1970-11-01 00:00:00”)= 44,weekofyear(“ 1970-11-01”)= 44.
| int | extract(字段 FROM 源)|从源中检索字段,例如天或小时(自 Hive 2.2.0起)。源必须是日期,时间戳记,间隔或可以转换为日期或时间戳记的字符串。支持的字段包括:日,星期几,小时,分钟,月,季度,秒,周和年。

Examples:

选择摘录(“ 2016-10-20”中的月份)得出 10.

选择摘录(来自“ 2016-10-20 05:06:07”的小时)的结果为 5.

选择摘录(dayofweek,来自“ 2016-10-20 05:06:07”),结果为 5.

选择摘录(从“ 1-3”年到月的月份中的月份)结果为 3.

选择摘录(从间隔'3 12:20:30 天到第二分钟的分钟数)得到 20.
| int | datediff(字符串结束日期,字符串开始日期)|返回从开始日期到结束日期的天数:datediff('2009-03-01','2009-02-27')= 2.
| * pre 2.1.0:字符串

2.1.0 on:* date | date_add(date/timestamp/string startdate,tinyint/smallint/int days)|添加了若干天作为开始日期:date_add('2008-12-31',1)='2009- 01-01'。

在 Hive 2.1.0(HIVE-13248)之前,返回类型为 String,因为创建方法时不存在 Date 类型。
| * pre 2.1.0:字符串

2.1.0 on:* date | date_sub(日期/时间戳记/字符串开始日期,tinyint/smallint/int 天)|减去开始日期的天数:date_sub('2008-12-31',1)='2008- 12-30'。

在 Hive 2.1.0(HIVE-13248)之前,返回类型为 String,因为创建方法时不存在 Date 类型。
| timestamp | from_utc_timestamp( { any primitive type } ts,字符串 timezone)|将 UTC 中的时间戳*转换为给定的时区(从 Hive 0.8.0开始)。

时间戳是一种原始类型,包括时间戳/日期,tinyint/smallint/int/bigint,float/double 和十进制。

小数部分被视为秒。整数值以毫秒为单位。例如,from_utc_timestamp(2592000.0,'PST'),from_utc_timestamp(2592000000,'PST')和 from_utc_timestamp(timestamp'1970-01-30 16:00:00','PST')都返回时间戳 1970-01-30 08:00:00. |
| timestamp | to_utc_timestamp( { any primitive type } ts,字符串时区)|将给定时区中的时间戳
转换为 UTC(从 Hive 0.8.0开始)。

*时间戳是一种原始类型,包括时间戳/日期,tinyint/smallint/int/bigint,float/double 和十进制。

小数部分被视为秒。整数值以毫秒为单位。例如,to_utc_timestamp(2592000.0,'PST'),to_utc_timestamp(2592000000,'PST')和 to_utc_timestamp(timestamp'1970-01-30 16:00:00','PST')都返回时间戳 1970-01-31 00:00:00.|
| date | current_date |返回查询评估开始时的当前日期(从 Hive 1.2.0开始)。在同一查询中对 current_date 的所有调用均返回相同的值。
| timestamp | current_timestamp |返回查询评估开始时的当前时间戳(从 Hive 1.2.0开始)。在同一查询中对 current_timestamp 的所有调用均返回相同的值。
| string | add_months(字符串起始日期,int num_months,output_date_format)|返回起始日期之后 num_months 的日期(从 Hive 1.1.0开始)。 start_date 是字符串,日期或时间戳。 num_months 是一个整数。如果 start_date 是该月的最后一天,或者如果结果月份的天数少于 start_date 的天部分,则结果是结果月份的最后一天。否则,结果与 start_date 具有相同的天组成部分。默认输出格式为“ yyyy-MM-dd”。

在 Hive 4.0.0 之前,日期的时间部分将被忽略。

从 Hive 4.0.0开始,add_months 支持可选参数 output_date_format,该参数接受一个 String,该 String 表示输出的有效日期格式。这样可以在输出中保留时间格式。

例如 :

add_months('2009-08-31',1)返回'2009-09-30'。

| add_months('2017-12-31 14:15:16',2,'YYYY-MM-dd HH:mm:ss')返回'2018-02-28 14:15:16'。
| string | last_day(字符串日期)|返回日期所属月份的最后一天(从 Hive 1.1.0开始)。 date 是格式为“ yyyy-MM-dd HH:mm:ss”或“ yyyy-MM-dd”的字符串。日期的时间部分将被忽略。
| string | next_day(字符串 start_date,字符串 day_of_week)|返回晚于 start_date 并命名为 day_of_week 的第一个日期(从 Hive 1.2.0开始)。 start_date 是一个字符串/日期/时间戳。 day_of_week 是 2 个字母,3 个字母或一周中某天的全名(例如 Mo,tue 和 FRIDAY)。 start_date 的时间部分将被忽略。例如:next_day('2015-01-14','TU')= 2015-01-20.
| string | trunc(字符串日期,字符串格式)|返回被截断为该格式指定的单位的日期(从 Hive 1.2.0开始)。支持的格式:MONTH/MON/MM,YEAR/YYYY/YY。示例:trunc('2015-03-17','MM')= 2015-03-01.
| double | months_between(date1,date2)|返回日期 date1 和 date2 之间的月份数(从 Hive 1.2.0开始)。如果 date1 晚于 date2,则结果为正。如果 date1 早于 date2,则结果为负。如果 date1 和 date2 是月份的同一天或月份的最后几天,则结果始终是整数。否则,UDF 将基于 31 天的月份来计算结果的小数部分,并考虑时间分量 date1 和 date2 的差异。 date1 和 date2 类型可以是日期,时间戳或字符串,格式为“ yyyy-MM-dd”或“ yyyy-MM-dd HH:mm:ss”。结果四舍五入到小数点后 8 位。例如:months_between('1997-02-28 10:30:00','1996-10-30')= 3.94959677 |
| string | date_format(日期/时间戳记/字符串 ts,字符串 fmt)|将日期/时间戳记/字符串转换为日期格式 fmt(从 Hive 1.2.0起)指定的格式的字符串值。支持的格式是 Java SimpleDateFormat 格式https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html。第二个参数 fmt 应该是常量。示例:date_format('2015-04-08','y')='2015'。

date_format 可用于实现其他 UDF,例如:

dayname(date)是 date_format(date,'EEEE')

dayofyear(date)是 date_format(date,'D')|

Conditional Functions

Return TypeName(Signature)Description
Tif(boolean testCondition,T valueTrue,T valueFalseOrNull)当 testCondition 为 true 时返回 valueTrue,否则返回 valueFalseOrNull。
boolean无效(a)如果 a 为 NULL,则返回 true,否则返回 false。
booleanisnotnull(a)如果 a 不为 NULL,则返回 true,否则返回 false。
Tnvl(T 值,T default_value)如果 value 为 null,则返回默认值,否则返回值(从 HIve 0.11开始)。
TCOALESCE(T v1,T v2,...)返回第一个不为 NULL 的 v,如果所有 v 均为 NULL,则返回 NULL。
T案例 a 何时 b 然后 c [何时 e] * [其他 f]结束当 a = b 时,返回 c;当 a = d 时,返回 e;否则返回 f。
TaTHEN 时的情况 b [When c THEN d] * [ELSE e]结束当 a = true 时,返回 b;当 c = true 时,返回 d;否则返回 e。
Tnullif(a,b)如果 a = b,则返回 NULL;否则返回 NULL。否则返回一个(从 Hive 2.3.0开始)。

简写:CASE 当 a = b 时为 NULL,否则为 a
voidassert_true(布尔条件)如果'condition'不为 true,则引发异常,否则返回 null(从 Hive 0.8.0开始)。例如,选择 assert_true(2 <1)。

String Functions

Hive 支持以下内置的 String 函数:

Return TypeName(Signature)Description
intascii(string str)返回 str 的第一个字符的数值。
stringbase64(binary bin)将参数从二进制转换为基数为 64 的字符串(从 Hive 0.12.0开始)。
intcharacter_length(string str)返回 str 中包含的 UTF-8 字符数(从 Hive 2.2.0开始)。函数 char_length 是该函数的简写。
stringchr(bigint|double A)返回具有与 A 等效的二进制值的 ASCII 字符(从 Hive 1 .3.0 和 2.1.0开始)。如果 A 大于 256,则结果等于 chr(A%256)。示例:选择 chr(88);返回“ X”。
stringconcat(字符串二进制 A,字符串二进制 B ...)返回按 Sequences 串联作为参数传入的字符串或字节得到的字符串。例如,concat('foo','bar')的结果为'foobar'。请注意,此函数可以接受任意数量的 Importing 字符串。
array<struct<string,double>>context_ngrams(array<array>,array,int K,int pf)给定字符串“ context”,从一组标记化语句返回前 k 个上下文 N-gram。有关更多信息,请参见StatisticsAndDataMining
stringconcat_ws(字符串 SEP,字符串 A,字符串 B ...)与上面的 concat()类似,但具有自定义分隔符 SEP。
stringconcat_ws(字符串 SEP,数组 )就像上面的 concat_ws()一样,但是采用字符串数组。 (自 Hive 0.9.0起)
string解码(二进制 bin,字符串字符集)使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF-16BE”,“ UTF-16LE”,“ UTF- 16')。如果任一参数为 null,则结果也将为 null。 (从 Hive 0.12.0开始。)
stringelt(N int,str1 字符串,str2 字符串,str3 字符串,...)返回索引号处的字符串。例如 elt(2,'hello','world')返回'world'。如果 N 小于 1 或大于参数个数,则返回 NULL。

(see https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_elt)
binaryencode(字符串 src,字符串字符集)使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF- 16BE”,“ UTF-16LE”,“ UTF-16”)。如果任一参数为 null,则结果也将为 null。 (自 Hive 0.12.0起。)
intfield(val T,val1 T,val2 T,val3 T,...)返回 val1,val2,val3,...列表中 val 的索引,如果找不到,则返回 0.例如 field('world','say','hello','world')返回 3.
支持所有基本类型,使用 str.equals(x)比较参数。如果 val 为 NULL,则返回值为 0.
(see https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field)
intfind_in_set(字符串 str,字符串 strList)返回 str 在 strList 中的首次出现,其中 strList 是逗号分隔的字符串。如果任一参数为 null,则返回 null。如果第一个参数包含任何逗号,则返回 0.例如,find_in_set('ab','abc,b,ab,c,def')返回 3.
stringformat_number(number x,int d)将数字 X 格式化为'#,###,###.##'之类的格式,四舍五入到 D 小数位,然后将结果作为字符串返回。如果 D 为 0,则结果没有小数点或小数部分。 (从 Hive 0.10.0开始;在Hive 0.14.0中修复了 float 类型的错误,在Hive 0.14.0中添加了小数类型支持)
stringget_json_object(字符串 json_string,字符串路径)根据指定的 json 路径从 json 字符串中提取 json 对象,并返回提取的 json 对象的 json 字符串。如果 Importing 的 json 字符串无效,它将返回 null。 注意:json 路径只能包含字符[0-9a-z_],即不能包含大写或特殊字符.此外,键*不能以数字开头. *这是由于对 Hive 列名的限制。
booleanin_file(字符串 str,字符串文件名)如果字符串 str 在文件名中显示为整行,则返回 true。
intinstr(string str,string substr)返回str中第一次出现的substr的位置。如果其中一个参数为null,则返回null;如果在str中找不到substr,则返回0。请注意,这不是基于零的。 str中的第一个字符的索引为 1.
intlength(字符串 A)返回字符串的长度。
intlocate(字符串 substr,字符串 str [,int pos])返回在位置 pos 之后的 str 中第一次出现 substr 的位置。
stringlower(字符串 A)lcase(字符串 A)返回将 B 的所有字符都转换成小写形式的字符串。例如,lower('fOoBaR')会导致'foobar'。
stringlpad(string str,int len,字符串 pad)返回 str,用 pad 左填充到 len 的长度。如果 str 大于 len,则返回值缩短为 len 个字符。如果填充字符串为空,则返回值为 null。
stringltrim(字符串 A)返回从 A 的开头(左侧)起修剪空格而产生的字符串。例如,ltrim('foobar')的结果为'foobar'。
array<struct<string,double>>ngrams(array<array>,int N,int K,int pf)从一组带标记的语句中返回前 k 个 N-gram,例如由句子()UDAF 返回的语句。有关更多信息,请参见StatisticsAndDataMining
intoctet_length(string str)返回以 UTF-8 编码保存字符串 str 所需的八位字节数(自 Hive 2.2.0以来)。请注意,octet_length(str)可以大于 character_length(str)。
stringparse_url(字符串 urlString,字符串 partToExtract [,字符串 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'。
stringprintf(String format,Obj ... args)返回根据 do printf 样式格式的字符串格式化的 Importing(从 Hive 0.9.0开始)。
stringquote(字符串文本)返回带引号的字符串(包括任何单引号HIVE-4.0.0的转义字符)
Importing输出
NULLNULL
DONT'DONT'
不要'DON 'T'
stringregexp_extract(字符串主题,字符串模式,int 索引)返回使用该模式提取的字符串。例如,regexp_extract('foothebar','foo(.*?)(bar)',2)返回'bar'。请注意,使用 sched 义字符类时必须格外小心:使用' s'作为第二个参数将与字母 s 匹配; '\ s'是匹配空格等所必需的。'index'参数是 Java regex Matcher group()方法的索引。有关'index'或 Java regex group()方法的更多信息,请参见docs/api/java/util/regex/Matcher.html
stringregexp_replace(字符串 INITIAL_STRING,字符串 PATTERN,字符串 REPLACEMENT)返回由 INITIAL_STRING 中所有与 PATTERN 中定义的 Java 正则表达式语法匹配的子字符串替换为 REPLACEMENT 实例所产生的字符串。例如,regexp_replace(“ foobar”,“ ooar”,“”)返回'fb'。请注意,使用 sched 义字符类时必须格外小心:使用' s'作为第二个参数将与字母 s 匹配; '\ s'是匹配空格等所必需的
stringrepeat(string str,int n)重复 str n 次。
stringreplace(字符串 A,字符串 OLD,字符串 NEW)返回字符串 A,其中所有非重叠出现的 OLD 都被 NEW 取代(从Hive1.3.0 和 2.1.0开始)。示例:选择 replace(“ ababab”,“ abab”,“ Z”);返回“ Zab”。
stringreverse(字符串 A)返回反转的字符串。
stringrpad(string str,int len,字符串 pad)返回 str,用 pad 右填充到 len 的长度。如果 str 大于 len,则返回值缩短为 len 个字符。如果填充字符串为空,则返回值为 null。
stringrtrim(string A)返回从 A 的末端(右侧)修剪空格所得到的字符串。例如,rtrim('foobar')会生成'foobar'。
array<array>句子(字符串 str,字符串 lang,字符串语言环境)将一串自然语言文本标记为单词和句子,其中每个句子在适当的句子边界处断开并作为单词数组返回。 “ lang”和“ locale”是可选参数。例如,句子(“ Hello there!您好吗?”)返回((“ Hello”,“ there”),(“ How”,“ are”,“ you”)))。
stringspace(int n)返回 n 个空格的字符串。
arraysplit(字符串 str,字符串 pat)在 pat 周围拆分 str(pat 是一个正则表达式)。
map<string,string>str_to_map(text [,delimiter1,delimiter2])使用两个定界符将文本分割为键/值对。 Delimiter1 将文本分成 K-V 对,Delimiter2 将每个 K-V 对分开。 默认分隔符是','代表 delimiter1,':'代表 delimiter2.
stringsubstr(字符串二进制 A,int 起始)substring(字符串二进制 A,int 起始)返回从字节 A 的起始位置开始到结尾的 A 的字节数组的子字符串或切片。例如,substr ('foobar',4)产生'bar'(请参见 [http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr])。
stringsubstr(字符串二进制 A,int 起始,int len)substring(字符串二进制 A,int 起始,int len)从长度为 len 的起始位置返回 A 的字节数组的子字符串或切片。例如,substr('foobar',4,1)的结果为'b'(请参见 [http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr])。
stringsubstring_index(字符串 A,字符串 delim,整数计数)在计数出现定界符 delim 之前(从 Hive 1.3.0开始)从字符串 A 返回子字符串。如果 count 为正,则返回最后定界符左侧的所有内容(从左侧开始计数)。如果 count 为负,则返回最后定界符右边的所有内容(从右边开始计数)。搜索 delim 时,Substring_index 执行区分大小写的匹配。例如:substring_index('www.apache.org','.',2)='www.apache'。
stringtranslate(字符串charvarcharImporting,字符串charvarchar 从,字符串charvarchar 到)通过将from字符串中存在的字符替换为to字符串中的相应字符来翻译 Importing 字符串。这类似于PostgreSQL中的translate函数。如果此 UDF 的任何参数为 NULL,则结果也为 NULL。 (自 Hive 0.10.0起,适用于字符串类型)
Hive 0.14.0开始添加了对 char/varchar 的支持。
stringtrim(string A)返回从 A 的两端修剪空格产生的字符串。例如,trim('foobar')产生'foobar'
binaryunbase64(string str)将参数从基数 64 的字符串转换为 BINARY。 (自 Hive 0.12.0起。)
stringupper(字符串 A)ucase(字符串 A)返回将 A 的所有字符都转换为大写字母的字符串。例如,upper('fOoBaR')的结果为'FOOBAR'。
stringinitcap(string A)返回字符串,每个单词的首字母大写,其他所有字母小写。单词由空格分隔。 (自 Hive 1.1.0起。)
intlevenshtein(字符串 A,字符串 B)返回两个字符串之间的 Levenshtein 距离(从 Hive 1.2.0开始)。例如,levenshtein('kitten','sitting')得出 3.
stringsoundex(字符串 A)返回字符串的 soundex 代码(从 Hive 1.2.0开始)。例如,soundex('Miller')生成 M460.

数据屏蔽功能

Hive 支持以下内置数据屏蔽功能:

Return TypeName(Signature)Description
stringmask(string str[, string upper[, string lower[, string number]]])返回 str 的掩码版本(从 Hive 2.1.0开始)。默认情况下,大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如 mask(“ abcd-EFGH-8765-4321”)的结果为 xxxx-XXXX-nnnn-nnnn。您可以通过提供其他参数来覆盖掩码中使用的字符:第二个参数控制大写字母的掩码字符,第三个参数控制小写字母的字符,第四个参数控制数字的字符。例如,mask(“ abcd-EFGH-8765-4321”,“ U”,“ l”,“#”)生成 llll-UUUU-####-####。
stringmask_first_n(string str[, int n])返回带掩码的版本的 str,其中前 n 个值被掩码(从 Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_first_n(“ 1234-5678-8765-4321”,4)生成 nnnn-5678-8765-4321.
stringmask_last_n(string str[, int n])返回带有掩码的最后一个 n 值的 str 的掩码版本(从 Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_last_n(“ 1234-5678-8765-4321”,4)生成 1234-5678-8765-nnnn。
stringmask_show_first_n(string str[, int n])返回 str 的掩码版本,显示未掩码的前 n 个字符(从 Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_show_first_n(“ 1234-5678-8765-4321”,4)的结果为 1234-nnnn-nnnn-nnnn。
stringmask_show_last_n(string str[, int n])返回 str 的掩码版本,显示未掩码的最后 n 个字符(从 Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_show_last_n(“ 1234-5678-8765-4321”,4)的结果为 nnnn-nnnn-nnnn-4321.
stringmask_hash(string|char|varchar str)返回基于 str 的哈希值(从 Hive 2.1.0开始)。哈希是一致的,可用于将跨表的掩码值连接在一起。对于非字符串类型,此函数返回 null。

Misc. Functions

Return TypeName(Signature)Description
variesjava_method(class, method[, arg1[, arg2..]])reflect的同义词。 (从 Hive 0.9.0开始。)
variesreflect(class, method[, arg1[, arg2..]])通过使用反射匹配参数签名来调用 Java 方法。 (从 Hive 0.7.0开始。)有关示例,请参见反映(通用)UDF
inthash(a1[, a2...])返回参数的哈希值。 (从 Hive 0.4 开始.)
stringcurrent_user()从已配置的身份验证器 Management 器返回当前的用户名(从 Hive 1.2.0开始)。可以与连接时提供的用户相同,但是与某些身份验证 Management 器(例如 HadoopDefaultAuthenticator)不同。
stringlogged_in_user()从会话状态返回当前的用户名(从 Hive 2.2.0开始)。这是连接到 Hive 时提供的用户名。
stringcurrent_database()返回当前的数据库名称(从 Hive 0.13.0开始)。
stringmd5(string/binary)计算字符串或二进制文件的 MD5 128 位校验和(从 Hive 1.3.0开始)。该值以 32 个十六进制数字的字符串形式返回,如果参数为 NULL,则返回 NULL。例如:md5('ABC')='902fbdd2b1df0c4f70b4a5d23525e932'。
stringsha1(string/binary)

sha(string/binary)
计算字符串或二进制文件的 SHA-1 摘要,并以十六进制字符串形式返回值(从 Hive 1.3.0开始)。例如:sha1('ABC')='3c01bdbb26f358bab27f267924aa2c9a03fcfdb8'。
bigintcrc32(string/binary)计算字符串或二进制参数的循环冗余校验值,并返回 bigint 值(从 Hive 1.3.0起)。例如:crc32('ABC')= 2743272264.
stringsha2(string/binary,int)计算 SHA-2 系列哈希函数(SHA-224,SHA-256,SHA-384 和 SHA-512)(从 Hive 1.3.0起)。第一个参数是要哈希的字符串或二进制。第二个参数表示结果的所需位长,该位的值必须为 224、256、384、512 或 0(等于 256)。从 Java 8 开始支持 SHA-224.如果任一参数为 NULL 或哈希长度不是允许的值之一,则返回值为 NULL。例如:sha2('ABC',256)='b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78'。
binaryaes_encrypt(Importing 字符串/二进制,密钥字符串/二进制)使用 AES 加密 Importing(自 Hive 1.3.0起)。可以使用 128、192 或 256 位的密钥长度。如果安装了 Java 密码学扩展(JCE)无限强度管辖权策略文件,则可以使用 192 位和 256 位密钥。如果任一参数为 NULL 或密钥长度不是允许的值之一,则返回值为 NULL。例如:base64(aes_encrypt('ABC','1234567890123456'))='y6Ss zCYObpCbgfWfyNWTw =='。
binaryaes_decrypt(Importing 二进制,密钥字符串/二进制)使用 AES 解密 Importing(自 Hive 1.3.0起)。可以使用 128、192 或 256 位的密钥长度。如果安装了 Java 密码学扩展(JCE)无限强度管辖权策略文件,则可以使用 192 位和 256 位密钥。如果任一参数为 NULL 或密钥长度不是允许的值之一,则返回值为 NULL。例如:aes_decrypt(unbase64('y6Ss zCYObpCbgfWfyNWTw =='),'1234567890123456')='ABC'。
stringversion()返回 Hive 版本(从 Hive 2.1.0开始)。该字符串包含 2 个字段,第一个是内部版本号,第二个是内部散列。示例:“ select version();”可能会返回“ 2.1.0.2.5.0.0-1245 r027527b9c5ce1a3d7d0b6d2e6de2378fb0c39232”。实际结果将取决于您的构建。
bigintsurrogate_key([write_id_bits,task_id_bits])在向表中 Importing 数据时自动为行生成数字 ID。只能用作酸表或仅插入表的默认值。

xpath

LanguageManual XPathUDF中描述了以下功能:

  • xpath,xpath_short,xpath_int,xpath_long,xpath_float,xpath_double,xpath_number,xpath_string

get_json_object

支持受限版本的 JSONPath:

  • $:根对象

  • 。 :子运算符

  • []:数组的下标运算符

  • *:[]的通配符

不支持的语法值得注意:

  • :零长度字符串作为键

  • ..:递归下降

  • @:当前对象/元素

  • ():脚本表达式

  • ?():过滤(脚本)表达式。

  • [,]:联合运算符

  • [start:end.step]:数组切片运算符

示例:src_json 表是单列(json),单行表:

+----+
                               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

内置的汇总函数(UDAF)

Hive 支持以下内置的聚合函数:

Return TypeName(Signature)Description
BIGINTcount(*),count(expr),count(DISTINCT expr [,expr ...])count(*)-返回检索到的行总数,包括包含 NULL 值的行。


count(expr)-返回提供的表达式为非 NULL 的行数。
count(DISTINCT expr [,expr])-返回为其提供的表达式唯一且非 NULL 的行数。可以使用hive.optimize.distinct.rewrite来优化执行。
|| 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)|返回组中数字列的无偏 samples 方差。
| DOUBLE | stddev_pop(col)|返回组中数字列的标准偏差。
| DOUBLE | stddev_samp(col)|返回组中数字列的无偏 samples 标准差。
| DOUBLE | covar_pop(col1,col2)|返回组中一对数字列的总体协方差。
|| DOUBLE | covar_samp(col1,col2)|返回组中一对数字列的 samples 协方差。
|| DOUBLE | corr(col1,col2)|返回组中一对数字列的皮尔逊相关系数。
| DOUBLE | percentile(BIGINT col,p)|返回组中列的精确 pth 百分位数(不适用于浮点类型)。 p 必须在 0 到 1 之间。注意:只能为整数值计算真实的百分位数。如果您 Importing 的内容不是整数,请使用 PERCENTILE_APPROX。
| array<double> | percentile(BIGINT col,array(p1 [,p2] ...))|返回组中列的确切百分位数 p1,p2,...(不适用于浮点类型)。 pi 必须在 0 到 1 之间。注意:只能为整数值计算真实百分位数。如果您 Importing 的内容不是整数,请使用 PERCENTILE_APPROX。
| DOUBLE | percentile_approx(DOUBLE col,p [,B])|返回组中数字列(包括浮点类型)的大约 pth 百分位数。 B 参数控制近似精度,但以存储为代价。值越高,近似值越好,默认值为 10,000.当 col 中的不同值的数量小于 B 时,这将给出精确的百分位数。
| array<double> | percentile_approx(DOUBLE col,array(p1 [,p2] ...)[,B])|与上述相同,但是接受并返回一个百分数值数组,而不是单个百分数值。
| double | regr_avgx(独立,从属)|相当于 avg(独立)。自Hive 2.2.0
| double | regr_avgy(独立,从属)|相当于 avg(独立)。自Hive 2.2.0
| double | regr_count(独立,从属)|返回用于拟合线性回归线的非空对的数量。自Hive 2.2.0
| double | regr_intercept(独立,从属)|返回线性回归线的 y 截距,即方程式 dependent = a 独立 b 中的 b 值。自Hive 2.2.0。|
| double | regr_r2(独立,从属)|返回确定系数以进行回归。自Hive 2.2.0。|
| double | regr_slope(独立,从属)|返回线性回归线的斜率,即方程式 dependent = a 独立 b 中 a 的值。自Hive 2.2.0。|
| double | regr_sxx(独立,从属)|等效于 regr_count(独立,从属)
var_pop(独立)。自Hive 2.2.0
| double | regr_sxy(独立,从属)|相当于 regr_count(独立,从属)
covar_pop(独立,从属)。自Hive 2.2.0
| double | regr_syy(独立,从属)|等效于 regr_count(独立,从属)* var_pop(独立)。自Hive 2.2.0
| array<struct { 'x','y' } > | histogram_numeric(col,b)|使用 b 个非均匀间隔的 bin 计算组中数字列的直方图。输出是大小为 b 的双值(x,y)坐标数组,这些数组表示 bin 的中心和高度|
| array | collect_set(col)|返回消除了重复元素的一组对象。
| array | collect_list(col)|返回具有重复项的对象列表。 (自 Hive 0.13.0起。)|
| INTEGER | ntile(INTEGER x)|将有序分区划分为称为桶的x组,并为分区中的每一行分配一个桶号。这样可以轻松计算三分位数,四分位数,十分位数,百分位数和其他常见的汇总统计信息。 (自 Hive 0.11.0起。)|

内置表生成函数(UDTF)

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

行设置列类型Name(Signature)Description
Texplode(ARRAY<T> a)将数组分解为多行。返回具有单列(* col *)的行集,该数组代表数组中每个元素的一行。
Tkey,Tvalueexplode(MAP<Tkey,Tvalue> m)将 Map 分解为多行。返回具有两列的行集(* key,value)*,ImportingMap 中的每个键值对一行。 (自 Hive 0.8.0起)。
int,Tposexplode(ARRAY<T> a)使用* int 类型的附加位置列将数组分解为多行(原始数组中项的位置,从 0 开始)。返回具有两列( pos,val *)的行集,该数组中的每个元素一行。
T1,...,Tninline(ARRAY<STRUCT<f1:T1,...,fn:Tn>> a)将结构数组分解为多行。返回具有 N 列的行集(N =结构中顶级元素的数量),数组中每个结构一行一行。 (从 Hive 0.10开始。)
T1,...,Tn/r堆栈(int r,T1 V1,...,Tn/r Vn)将* n 个值 V1,...,Vn 分解为 r 行。每行将具有 n/r *列。 * r *必须是常数。
string1,...,stringnjson_tuple(字符串 jsonStr,字符串 k1,...,字符串 kn)接收 JSON 字符串和一组* n 键,并返回 n *值的 Tuples。这是get_json_object UDF 的一种更有效的版本,因为它只需一次调用就可以获取多个键。
string 1,...,stringnparse_url_tuple(字符串 urlStr,字符串 p1,...,字符串 pn)接受 URL 字符串和一组* n * URL 部分,并返回* n *值的 Tuples。这类似于parse_url() UDF,但可以一次从 URL 中提取多个部分。有效的部件名称是:HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:\ 。

Usage Examples

explode (array)

select explode(array('A','B','C'));
select explode(array('A','B','C')) as col;
select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf;
select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf as col;
col
A
B
C


explode (map)

select explode(map('A',10,'B',20,'C',30));
select explode(map('A',10,'B',20,'C',30)) as (key,value);
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf;
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf as key,value;
keyvalue
A10
B20
C30

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;
posval
0A
1B
2C

内联(结构数组)

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;
col1col2col3
A102015-01-01
B202016-02-02


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;
col0col1col2
A102015-01-01
B202016-01-01

使用语法“ 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

不具有这些限制的其他语法,请参见LanguageManual LateralView

如果要创建自定义 UDTF,也请参见Writing UDTFs

explode

explode()接受数组(或 Map)作为 Importing,并将数组(Map)的元素作为单独的行输出。 UDTF 可以在 SELECT 表达式列表中使用,也可以作为 LATERAL VIEW 的一部分使用。

作为在 SELECT 表达式列表中使用explode()的示例,请考虑一个名为 myTable 的表,该表具有单列(myCol)和两行:

Array<int> myCol
[100,200,300]
[400,500,600]

然后运行查询:

SELECT explode(myCol) AS myNewCol FROM myTable;

will produce:

(int) myNewCol
100
200
300
400
500
600

Maps 的用法类似:

SELECT explode(myMap) AS (myMapKey, myMapValue) FROM myMapTable;

posexplode

Version

自 Hive 0.13.0 起可用。参见HIVE-4943

posexplode()explode类似,但它不仅返回数组的元素,还返回元素及其在原始数组中的位置。

作为在 SELECT 表达式列表中使用posexplode()的示例,请考虑一个名为 myTable 的表,该表具有单列(myCol)和两行:

Array<int> myCol
[100,200,300]
[400,500,600]

然后运行查询:

SELECT posexplode(myCol) AS pos, myNewCol FROM myTable;

will produce:

(int) pos(int) myNewCol
1100
2200
3300
1400
2500
3600

json_tuple

Hive 0.7 中引入了新的 json_tuple()UDTF。它使用一组名称(键)和一个 JSON 字符串,并使用一个函数返回值的 Tuples。这比调用 GET_JSON_OBJECT 从单个 JSON 字符串中检索多个密钥要有效得多。在任何情况下,单个 JSON 字符串都会被解析多次,如果您解析一次 JSON_TUPLE,查询将更加高效。由于 JSON_TUPLE 是 UDTF,因此您将需要使用LATERAL VIEW语法来实现相同的目标。

For example,

select a.timestamp, get_json_object(a.appevents, '$.eventid'), get_json_object(a.appenvets, '$.eventname') from log a;

应该更改为:

select a.timestamp, b.*
from log a lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;

parse_url_tuple

parse_url_tuple()UDTF 与 parse_url()相似,但是可以提取给定 URL 的多个部分,以 Tuples 形式返回数据。可以通过将冒号和键附加到 partToExtract 参数来提取 QUERY 中特定键的值,例如 parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1' ,'QUERY:k1','QUERY:k2')返回值为'v1','v2'的 Tuples。这比多次调用 parse_url()更有效。所有 Importing 参数和输出列类型都是字符串。

SELECT b.*
FROM src LATERAL VIEW parse_url_tuple(fullurl, 'HOST', 'PATH', 'QUERY', 'QUERY:id') b as host, path, query, query_id LIMIT 1;

对 f(列)进行分组和排序

典型的 OLAP 模式是您有一个 timestamp 列,并且希望按每日或其他较不精确的日期窗口进行分组,而不是按秒进行分组。因此,您可能要选择 concat(year(dt),month(dt)),然后在该 concat()上分组。但是,如果您尝试在应用了函数和别名的列上使用 GROUP BY 或 SORT BY,如下所示:

select f(col) as fc, count(*) from table_name group by fc;

你会得到一个错误:

FAILED: Error in semantic analysis: line 1:69 Invalid Table Alias or Column Reference fc

因为您无法对已应用功能的列别名进行 GROUP BY 或 SORT BY。有两种解决方法。首先,您可以使用子查询来重新构造此查询,这有点复杂:

select sq.fc,col1,col2,...,colN,count(*) from
  (select f(col) as fc,col1,col2,...,colN from table_name) sq
 group by sq.fc,col1,col2,...,colN;

或者您可以确保不使用更简单的列别名:

select f(col) as fc, count(*) from table_name group by f(col);

如果您想进一步讨论,请与 RiotGames dot com 的 Tim Ellis(tellis)联系。

Utility Functions

Function NameReturn TypeDescriptionTo Run
versionString提供 Hive 版本详细信息(软件包内置版本)select version();
buildversionString版本功能的扩展,其中包括校验和select buildversion();

UDF internals

UDF 的评估方法的上下文一次是一行。像这样的 UDF 的简单调用

SELECT length(string_col) FROM table_name;

将评估作业的 Map 部分中每个 string_col 值的长度。在 Map 端评估 UDF 的副作用是您无法控制发送到 Map 器的行的 Sequences。发送到 Map 器的文件拆分的序列化 Sequences 与此相同。任何 reduce 边操作(例如 SORT BY,ORDER BY,常规 JOIN 等)将应用于 UDF 输出,就好像它只是表的另一列一样。这很好,因为 UDF 的评估方法的上下文一次只能排成一行。

如果您想控制将哪些行发送到相同的 UDF(可能以什么 Sequences),您将敦促在简化阶段对 UDF 进行评估。这可以通过使用分配依据,排序依据,分组依据实现。查询示例为:

SELECT reducer_udf(my_col, distribute_col, sort_col) FROM
(SELECT my_col, distribute_col, sort_col FROM table_name DISTRIBUTE BY distribute_col SORT BY distribute_col, sort_col) t

但是,有人可能会争辩说,控制发送到同一 UDF 的行集的前提是在该 UDF 中进行聚合。在这种情况下,使用用户定义的聚合函数(UDAF)是更好的选择。您可以阅读有关编写 UDAF here的更多信息。或者,您可以使用Hive 的转换功能使用自定义的 reduce 脚本来完成相同的任务。这两个选项都将在归约方面进行汇总。

创建自定义 UDF

有关如何创建自定义 UDF 的信息,请参见Hive PluginsCreate Function

选择 explode(array('A','B','C'));选择 explode(array('A','B','C'))作为 col;从(选择 0)t 中选择 tf.侧面爆炸(array('A','B','C'))tf;从(选择 0)中选择 tf. t 侧面爆炸(array('A','B','C')) tf 作为 col;