以下运算符比较传递的操作数,并根据操作数之间的比较是否成立来生成TRUE或FALSE值。
操作员 |
操作数类型 |
描述 |
---|---|---|
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 |
所有原始类型 |
如果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 NULL |
所有类型 |
如果表达式A的计算结果为NULL,则为TRUE,否则为FALSE。 |
一个不为空 |
所有类型 |
如果表达式A的计算结果为NULL,则为FALSE,否则为TRUE。 |
是[否](TRUE | FALSE) | 布尔类型 | 仅当A满足条件时评估为TRUE。(因为:3.0.0 )注意:NULL为UNKNOWN,因此(UNKNOWN IS TRUE)和(UNKNOWN IS FALSE)都评估为FALSE。 |
A [不]喜欢B |
弦 |
如果A或B为NULL,则为NULL,如果字符串A与SQL简单正则表达式B匹配,则为TRUE,否则为FALSE。逐个字符进行比较。B中的_字符匹配A中的任何字符(类似于posix正则表达式中的。),而B中的%字符匹配A中任意数目的字符(类似于posix正则表达式中的。*)。例如,像'foo'这样的'foobar'的值为FALSE,而像'foo_ _ _'这样的'foobar'的值为TRUE,而'foobar'这样的'foo%'的值为。 |
阿里克B |
弦 |
如果A或B为NULL,则为NULL,如果A的任何子字符串(可能为空)与Java正则表达式B匹配,则为TRUE,否则为FALSE。例如,'foobar'RLIKE'foo'的计算结果为TRUE,'foobar'RLIKE'^ f。* r $'的计算结果也为TRUE。 |
A REGEXP B |
弦 |
与RLIKE相同。 |
以下运算符支持对操作数的各种常见算术运算。所有返回号码类型;如果任何操作数为NULL,则结果也为NULL。
操作员 |
操作数类型 |
描述 |
---|---|---|
A + B |
所有数字类型 |
给出将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 B | 整数类型 | 给出将A除以BEg 17 div 3所得的整数部分结果为5。 |
A%B |
所有数字类型 |
给出A除以B的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。 |
A&B |
所有数字类型 |
给出A和B的按位与的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。 |
A | 乙 |
所有数字类型 |
给出A和B的按位或的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。 |
A ^ B |
所有数字类型 |
给出A和B的按位XOR结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。 |
〜A |
所有数字类型 |
给出A的按位NOT的结果。结果的类型与A的类型相同。 |
以下运算符为创建逻辑表达式提供支持。它们都根据操作数的布尔值返回布尔值TRUE,FALSE或NULL。NULL表现为“未知”标志,因此,如果结果取决于未知状态,则结果本身是未知的。
操作员 |
操作数类型 |
描述 |
---|---|---|
A和B |
布尔值 |
如果A和B均为TRUE,则为TRUE,否则为FALSE。如果A或B为NULL,则为NULL。 |
A或B |
布尔值 |
如果A或B或两者均为TRUE,则为TRUE,否则为FALSE或NULL为NULL。 |
不是 |
布尔值 |
如果A为FALSE,则为TRUE;如果A为NULL,则为NULL。否则为FALSE。 |
!一个 |
布尔值 |
与NOT A相同。 |
A IN(val1,val2,...) |
布尔值 |
如果A等于任何值,则为TRUE。从Hive开始,IN语句支持0.13 子查询。 |
一个非输入(val1,val2,...) |
布尔值 |
如果A不等于任何值,则为TRUE。从Hive开始,NOT IN语句支持0.13 子查询。 |
[NOT] EXISTS(子查询) |
|
如果子查询返回至少一行,则为TRUE。从Hive 0.13开始受支持。 |
操作员 |
操作数类型 |
描述 |
---|---|---|
A || 乙 |
弦 |
连接操作数-的简写 |
以下函数构造复杂类型的实例。
构造函数 |
操作数 |
描述 |
---|---|---|
地图 |
(key1,value1,key2,value2,...) |
使用给定的键/值对创建一个映射。 |
结构 |
(val1,val2,val3,...) |
用给定的字段值创建一个结构。结构字段名称将为col1,col2,...。 |
named_struct |
(名称1,名称1,名称2,名称2,...) |
用给定的字段名称和值创建一个结构。(从Hive 0.8.0开始。) |
数组 |
(val1,val2,...) |
用给定的元素创建一个数组。 |
create_union |
(天,val1,val2,...) |
使用tag参数指向的值创建联合类型。 |
以下运算符提供了访问复杂类型中的元素的机制。
操作员 |
操作数类型 |
描述 |
---|---|---|
一个] |
A是一个数组,n是一个整数 |
返回数组A中的第n个元素。第一个元素的索引为0。例如,如果A是包含['foo','bar']的数组,则A [0]返回'foo',而A [1]返回'酒吧'。 |
M [键] |
M是Map |
返回与映射中的键对应的值。例如,如果M是包含{'f'->'foo','b'->'bar','all'->'foobar'}的映射,则M ['all']返回'foobar'。 |
x |
S是一个结构 |
返回S的x字段。例如,对于结构foobar {int foo,int bar},foobar.foo返回存储在结构的foo字段中的整数。 |
Hive支持以下内置数学函数;当参数为NULL时,大多数返回NULL:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
双 |
圆形(双A) |
返回的舍入 |
双 |
舍入(DOUBLE a,INT d) |
返回 |
双 | 圆(双a) | 返回a 使用HALF_EVEN舍入模式的舍入后的BIGINT值(从Hive 1.3.0,2.0.0开始)。也称为高斯舍入或银行家舍入。例如:bround(2.5)= 2,bround(3.5)= 4。 |
双 | 圆角(DOUBLE a,INT d) | 使用HALF_EVEN舍入模式返回a 舍入到d 小数位(从Hive 1.3.0,2.0.0开始)。例如:bround(8.25,1)= 8.2,bround(8.35,1)= 8.4。 |
比金特 |
地板(双A) |
返回 |
比金特 |
天花板(DOUBLE A),天花板(DOUBLE A) |
返回等于或大于的最小BIGINT值 |
双 |
rand(),rand(INT种子) |
返回从0到1均匀分布的随机数(逐行变化)。指定种子将确保所生成的随机数序列具有确定性。 |
双 |
exp(DOUBLE a),exp(DECIMAL a) |
返回这里是自然对数的底数。Hive 0.13.0中添加了十进制版本。 |
双 |
ln(DOUBLE a),ln(DECIMAL a) |
返回参数的自然对数 |
双 |
log10(DOUBLE a),log10(DECIMAL a) |
返回参数的以10为底的对数 |
双 |
log2(DOUBLE a),log2(DECIMAL a) |
返回参数的以2为底的对数 |
双 |
日志(双底,双a) log(十进制基数,十进制a) |
返回 |
双 |
pow(双a,双p),功率(双a,双p) |
返回。 |
双 |
sqrt(DOUBLE a),sqrt(DECIMAL a) |
返回的平方根 |
串 |
bin(BIGINT a) |
以二进制格式返回数字(请参见http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_bin)。 |
串 |
十六进制(BIGINT a)十六进制(STRING a)十六进制(BINARY a) |
如果参数是 |
二进制 |
十六进制(STRING a) |
十六进制的倒数。将每对字符解释为十六进制数字,并转换为数字的字节表示形式。( |
串 |
conv(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)。 |
双 |
abs(双a) |
返回绝对值。 |
整数或双 |
pmod(INT a,INT b),pmod(DOUBLE a,DOUBLE b) |
返回的正值 |
双 |
sin(DOUBLE a),sin(DECIMAL a) |
返回 |
双 |
asin(DOUBLE a),asin(DECIMAL a) |
返回 |
双 |
cos(DOUBLE a),cos(DECIMAL a) |
返回 |
双 |
acos(DOUBLE a),acos(DECIMAL a) |
返回 |
双 |
tan(DOUBLE a),tan(DECIMAL a) |
返回 |
双 |
得分手(双A),得分手(十进制A) |
返回的反正切值 |
双 |
度数(DOUBLE a),度数(DECIMAL a) |
将的值 |
双 |
弧度(DOUBLE a),弧度(DOUBLE a) |
将值 |
整数或双 |
正(INT a),正(DOUBLE a) |
返回 |
整数或双 |
负数(INT a),负数(DOUBLE a) |
返回 |
双或整数 |
符号(DOUBLE a),符号(DECIMAL a) |
返回符号 |
双 |
is() |
返回的值 |
双 |
pi() |
返回的值 |
比金特 | 阶乘(INT a) | 返回a (从Hive 1.2.0开始)的阶乘。有效a 值为[0..20]。 |
双 | cbrt(DOUBLE a) | 返回a double值的多维数据集根(从Hive 1.2.0开始)。 |
INT 比金特 |
向左移(TINYINT | SMALLINT | INT a,INT b) 左移(BIGINT a,INT b) |
按位左移(从Hive 1.2.0开始)。 为tinyint,smallint和int返回int |
INT 比金特 |
右移(TINYINT | SMALLINT | INT a,INT b) 右移(BIGINT a,INT b) |
按位右移(从Hive 1.2.0开始)。 为tinyint,smallint和int返回int |
INT 比金特 |
shiftrightunsigned(TINYINT | SMALLINT | INT a,INT b), shiftrightunsigned(BIGINT a,INT b) |
按位无符号右移(从Hive 1.2.0开始)。向右移动位置。 为tinyint,smallint和int返回int |
Ť | 最大(T v1,T v2,...) | 返回值列表的最大值(从Hive 1.1.0开始)。修复了当一个或多个参数为NULL且放宽了严格的类型限制(与“>”运算符一致时,从Hive 2.0.0开始)时返回NULL的问题。 |
Ť | 至少(T v1,T v2,...) | 返回值列表中的最小值(从Hive 1.1.0开始)。修复了当一个或多个参数为NULL并且放宽了严格的类型限制(与Hive 2.0.0相同)时返回严格的类型限制的问题。 |
INT | width_bucket(NUMERIC expr,NUMERIC min_value,NUMERIC max_value,INT num_buckets) | 通过将expr映射到第i个大小相等的存储桶中,返回0到num_buckets + 1之间的整数。通过将[min_value,max_value]分成大小相等的区域来制作存储桶。如果expr |
十进制数据类型的数学函数和运算符
版
Hive 0.11.0(HIVE-2693)中引入了十进制数据类型。
所有常规算术运算符(例如+,-,*,/)和相关的数学UDF(Floor,Ceil,Round等)都已更新为处理十进制类型。有关支持的UDF的列表,请参阅数学的UDF在蜂巢的数据类型。
Hive支持以下内置收集功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
整型 |
大小(Map |
返回地图类型中的元素数。 |
整型 |
大小(Array |
返回数组类型中的元素数。 |
数组 |
map_keys(地图 |
返回包含输入映射键的无序数组。 |
数组 |
map_values(Map |
返回包含输入映射值的无序数组。 |
布尔值 |
array_contains(Array |
如果数组包含值,则返回TRUE。 |
数组 |
sort_array(Array |
根据数组元素的自然顺序对输入数组进行升序排序并返回(从0.9.0版本开始)。 |
Hive支持以下类型转换功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
二元 |
二进制(字符串|二进制) |
将参数转换为二进制。 |
期望“ =”跟随“类型” |
演员表(expr as |
将表达式expr的结果转换为 |
Hive支持以下内置日期功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
串 |
from_unixtime(bigint unixtime [,字符串格式]) |
将unix纪元(1970-01-01 00:00:00 UTC)的秒数转换为一个字符串,该字符串表示当前系统时区中该时刻的时间戳,格式为“ 1970-01-01 00:00: 00”。 |
比金特 |
unix_timestamp() |
以秒为单位获取当前的Unix时间戳。此函数不是确定性的,其值在查询执行范围内也不是固定的,因此会阻止对查询的适当优化-自2.0版以来已弃用此函数,而推荐使用CURRENT_TIMESTAMP常量。 |
比金特 |
unix_timestamp(字符串日期) |
|
比金特 |
unix_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: 日期 |
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类型。 |
整型 |
年(字符串日期) |
返回日期或时间戳字符串的年份部分:year(“ 1970-01-01 00:00:00”)= 1970,year(“ 1970-01-01”)= 1970。 |
整型 |
季度(日期/时间戳/字符串) | 返回日期,时间戳或范围在1到4之间的字符串的一年的四分之一(从Hive 1.3.0开始)。示例:quarter('2015-04-08')= 2。 |
整型 |
月(字符串日期) |
返回日期或时间戳字符串的月份部分:month(“ 1970-11-01 00:00:00”)= 11,month(“ 1970-11-01”)= 11。 |
整型 |
日期(字符串日期)dayofmonth(日期) |
返回日期或时间戳字符串的日期部分:day(“ 1970-11-01 00:00:00”)= 1,day(“ 1970-11-01”)= 1。 |
整型 |
小时(字符串日期) |
返回时间戳的小时:hour('2009-07-30 12:58:59')= 12,hour('12:58:59')= 12。 |
整型 |
分钟(字符串日期) |
返回时间戳的分钟。 |
整型 |
秒(字符串日期) |
返回时间戳的秒数。 |
整型 |
年中的星期(字符串日期) |
返回时间戳字符串的星期数:weekofyear(“ 1970-11-01 00:00:00”)= 44,weekofyear(“ 1970-11-01”)= 44。 |
整型 | 提取(来自字段的字段) |
从源中检索字段,例如天或小时(从Hive 2.2.0开始)。源必须是日期,时间戳,时间间隔或可以转换为日期或时间戳的字符串。支持的字段包括:日,星期几,小时,分钟,月,季度,秒,周和年。 例子:
|
整型 |
datediff(字符串结束日期,字符串开始日期) |
返回从开始日期到结束日期的天数:datediff('2009-03-01','2009-02-27')= 2。 |
2.1.0之前的版本: 字符串 2.1.0 on: 日期 |
date_add(日期/时间戳/字符串开始日期,tinyint / smallint / int天) |
添加开始日期的天数:date_add('2008-12-31',1)='2009-01-01'。 在Hive 2.1.0(HIVE-13248)之前,返回类型为String,因为创建方法时不存在Date类型。 |
2.1.0之前的版本: 字符串 2.1.0 on: 日期 |
date_sub(日期/时间戳/字符串开始日期,tinyint / smallint / int天) |
减去开始日期的天数:date_sub('2008-12-31',1)='2008-12-30'。 在Hive 2.1.0(HIVE-13248)之前,返回类型为String,因为创建方法时不存在Date类型。 |
时间戳记 |
from_utc_timestamp({ 任何原始类型 } ts,字符串时区) |
将UTC中的timestamp *转换为给定的时区(从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。 |
时间戳记 |
to_utc_timestamp({ 任何原始类型 } 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。 |
日期 | 当前的日期 | 返回查询评估开始时的当前日期(从Hive 1.2.0开始)。同一查询中对current_date的所有调用均返回相同的值。 |
时间戳记 | current_timestamp | 返回查询评估开始时的当前时间戳(从Hive 1.2.0开始)。同一查询中对current_timestamp的所有调用均返回相同的值。 |
串 | add_months(字符串起始日期,整数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'。 |
串 | last_day(字符串日期) | 返回日期所属月份的最后一天(从Hive 1.1.0开始)。date是格式为“ yyyy-MM-dd HH:mm:ss”或“ yyyy-MM-dd”的字符串。日期的时间部分将被忽略。 |
串 | next_day(字符串开始日期,字符串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。 |
串 | 截断(字符串日期,字符串格式) | 返回截断为格式指定单位的日期(从Hive 1.2.0开始)。支持的格式:MONTH / MON / MM,YEAR / YYYY / YY。示例:trunc('2015-03-17','MM')= 2015-03-01。 |
双 | 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 |
串 | 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,例如:
|
返回类型 |
姓名(签名) |
描述 |
---|---|---|
Ť |
if(boolean testCondition,T valueTrue,T valueFalseOrNull) |
当testCondition为true时返回valueTrue,否则返回valueFalseOrNull。 |
布尔值 | 无效(a) | 如果a为NULL,则返回true,否则返回false。 |
布尔值 | isnotnull(a) | 如果a不为NULL,则返回true,否则返回false。 |
Ť | nvl(T值,T default_value) | 如果value为null,则返回默认值,否则返回值(从HIve 0.11开始)。 |
Ť |
COALESCE(T v1,T v2,...) |
返回第一个不为NULL的v,如果所有v均为NULL,则返回NULL。 |
Ť |
案例a何时b然后c [何时e] * [其他f]结束 |
当a = b时,返回c; 当a = d时,返回e; 否则返回f。 |
Ť |
aTHEN时的情况b [When c THEN d] * [ELSE e]结束 |
当a = true时,返回b; 当c = true时,返回d; 否则返回e。 |
Ť | nullif(a,b) | 如果a = b,则返回NULL。否则返回a (从Hive 2.3.0开始)。 简写:CASE,当a = b时为NULL,否则为a |
虚空 | assert_true(布尔条件) | 如果'condition'不为true,则引发异常,否则返回null(从Hive 0.8.0开始)。例如,选择assert_true(2 <1)。 |
Hive支持以下内置的String函数:
返回类型 |
姓名(签名) |
描述 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|
整型 |
ascii(字符串str) |
返回str的第一个字符的数值。 |
||||||||
串 |
base64(二进制bin) |
将参数从二进制转换为基本64字符串(从Hive 0.12.0开始)。 |
||||||||
整型 | character_length(字符串str) | 返回str中包含的UTF-8字符数(从Hive 2.2.0开始)。函数char_length是该函数的简写。 | ||||||||
串 | chr(bigint | double A) | 返回具有与A等效的二进制值的ASCII字符(从Hive 1.3.0和2.1.0开始)。如果A大于256,则结果等于chr(A%256)。示例:选择chr(88); 返回“ X”。 | ||||||||
串 |
concat(字符串|二进制A,字符串|二进制B ...) |
返回按顺序串联作为参数传入的字符串或字节所得到的字符串或字节。例如,concat('foo','bar')的结果为'foobar'。请注意,此函数可以接受任意数量的输入字符串。 |
||||||||
数组<结构<字符串,双>> |
context_ngrams(array |
给定字符串“ context”,从一组标记化语句返回前k个上下文N-gram。有关更多信息,请参见StatisticsAndDataMining。 |
||||||||
串 |
concat_ws(字符串SEP,字符串A,字符串B ...) |
与上面的concat()类似,但具有自定义分隔符SEP。 |
||||||||
串 |
concat_ws(字符串SEP,数组 |
就像上面的concat_ws()一样,但是采用字符串数组。(从Hive 0.9.0开始) |
||||||||
串 |
解码(二进制bin,字符串字符集) |
使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF-16BE”,“ UTF-16LE”,“ UTF- 16')。如果任一参数为null,则结果也将为null。(从Hive 0.12.0开始。) |
||||||||
串 | elt(N int,str1字符串,str2字符串,str3字符串,...) | 返回索引号处的字符串。例如elt(2,'hello','world')返回'world'。如果N小于1或大于参数个数,则返回NULL。 (请参阅https://dev.mysql.com/doc/refman/5.7/zh-CN/string-functions.html#function_elt) |
||||||||
二元 |
编码(字符串src,字符串字符集) |
使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF-16BE”,“ UTF-16LE”,“ UTF- 16')。如果任一参数为null,则结果也将为null。(从Hive 0.12.0开始。) |
||||||||
整型 | 栏位(val T,val1 T,val2 T,val3 T,...) | 返回val1,val2,val3,...列表中val的索引;如果未找到,则返回0。例如,字段(“ world”,“ say”,“ hello”,“ world”)返回3。 (请参阅https://dev.mysql.com/doc/refman/5.7/zh-CN/string-functions.html#function_field) |
||||||||
整型 |
find_in_set(字符串str,字符串strList) |
返回str在strList中的第一次出现,其中strList是一个逗号分隔的字符串。如果任一参数为null,则返回null。如果第一个参数包含逗号,则返回0。例如,find_in_set('ab','abc,b,ab,c,def')返回3。 |
||||||||
串 |
format_number(数字x,整数d) |
将数字X格式化为'#,###,###。##'之类的格式,四舍五入到D小数位,然后将结果作为字符串返回。如果D为0,则结果没有小数点或小数部分。(由于蜂房的0.10.0 ;臭虫以固定在浮子类型蜂房0.14.0,在加入十进制型支撑蜂巢0.14.0) |
||||||||
串 |
get_json_object(字符串json_string,字符串路径) |
根据指定的json路径从json字符串中提取json对象,并返回提取的json对象的json字符串。如果输入的json字符串无效,它将返回null。注意:json路径只能包含字符[0-9a-z_],即不能包含大写或特殊字符。另外,键*不能以数字开头。*这是由于对Hive列名的限制。 |
||||||||
布尔值 |
in_file(字符串str,字符串文件名) |
如果字符串str在文件名中显示为整行,则返回true。 |
||||||||
整型 |
instr(字符串str,字符串substr) |
返回 |
||||||||
整型 |
长度(字符串A) |
返回字符串的长度。 |
||||||||
整型 |
定位(字符串substr,字符串str [,int pos]) |
返回在位置pos之后的str中第一次出现substr的位置。 |
||||||||
串 |
小写(字符串A)lcase(字符串A) |
返回将B的所有字符都转换为小写形式的字符串。例如,lower('fOoBaR')会导致'foobar'。 |
||||||||
串 |
lpad(字符串str,int len,字符串pad) |
返回str,在其左边填充pad,长度为len。如果str大于len,则返回值缩短为len个字符。如果填充字符串为空,则返回值为null。 |
||||||||
串 |
ltrim(字符串A) |
返回从A的开头(左侧)起修剪空格所得的字符串。例如,ltrim('foobar')的结果为'foobar'。 |
||||||||
数组<结构<字符串,双>> |
ngrams(array |
从一组标记化的句子中返回前k个N-gram,例如句子()UDAF返回的句子。有关更多信息,请参见StatisticsAndDataMining。 |
||||||||
整型 | octet_length(字符串str) | 返回以UTF-8编码保存字符串str所需的八位字节数(从Hive 2.2.0开始)。请注意,octet_length(str)可以大于character_length(str)。 | ||||||||
串 |
parse_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'。 |
||||||||
串 |
printf(String format,Obj ... args) |
返回根据do printf样式格式字符串格式化的输入(从Hive 0.9.0开始)。 |
||||||||
串 | quote(字符串文本) | 返回带引号的字符串(包括任何单引号HIVE-4.0.0的转义字符)
|
||||||||
串 |
regexp_extract(字符串主题,字符串模式,int索引) |
返回使用模式提取的字符串。例如,regexp_extract('foothebar','foo(。*?)(bar)',2)返回'bar'。请注意,使用预定义的字符类时必须格外小心:使用'\ s'作为第二个参数将与字母s匹配;'\\ s'是匹配空格等所必需的。'index'参数是Java regex Matcher group()方法的索引。有关'index'或Java regex group()方法的更多信息,请参见docs / api / java / util / regex / Matcher.html。 |
||||||||
串 |
regexp_replace(字符串INITIAL_STRING,字符串PATTERN,字符串REPLACEMENT) |
返回将替换INITIAL_STRING中所有与PATTERN中定义的Java正则表达式语法匹配的子字符串替换为REPLACEMENT的实例所产生的字符串。例如,regexp_replace(“ foobar”,“ oo | ar”,“”)返回'fb'。请注意,使用预定义的字符类时必须格外小心:使用'\ s'作为第二个参数将与字母s匹配;'\\ s'是匹配空格等所必需的。 |
||||||||
串 |
重复(字符串str,int n) |
重复str n次。 |
||||||||
串 | 替换(字符串A,字符串OLD,字符串NEW) | 返回字符串A,其中所有不重叠的OLD都替换为NEW(从Hive 1.3.0和2.1.0开始)。示例:选择replace(“ ababab”,“ abab”,“ Z”); 返回“ Zab”。 | ||||||||
串 |
反向(字符串A) |
返回反转的字符串。 |
||||||||
串 |
rpad(字符串str,int len,字符串pad) |
返回str,右用pad填充到len的长度。如果str大于len,则返回值缩短为len个字符。如果填充字符串为空,则返回值为null。 |
||||||||
串 |
rtrim(字符串A) |
返回从A的结尾(右侧)修剪空格所得到的字符串。例如,rtrim('foobar')结果为'foobar'。 |
||||||||
数组<数组<字符串>> |
句子(字符串str,字符串lang,字符串语言环境) |
将一串自然语言文本标记为单词和句子,其中每个句子在适当的句子边界处断开并作为单词数组返回。“ lang”和“ locale”是可选参数。例如,句子(“ Hello there!你好吗?”)返回((“ Hello”,“ there”),(“ How”,“ are”,“ you”)))。 |
||||||||
串 |
空格(int n) |
返回n个空格的字符串。 |
||||||||
数组 |
split(字符串str,字符串pat) |
在pat周围拆分str(pat是一个正则表达式)。 |
||||||||
map <字串,字串> |
str_to_map(text [,delimiter1,delimiter2]) |
使用两个定界符将文本拆分为键/值对。Delimiter1将文本分成KV对,Delimiter2将每个KV对分开。默认的定界符是','代表定界符1,':'代表定界符2。 |
||||||||
串 |
substr(字符串|二进制A,整数开始)substring(字符串|二进制A,整数开始) |
返回A的字节数组的子字符串或切片,从字符串的起始位置开始到字符串A的结尾。例如,substr('foobar',4)的结果为'bar'(请参见[ http://dev.mysql.com /doc/refman/5.0/zh-CN/string-functions.html#function_substr ])。 |
||||||||
串 |
substr(字符串|二进制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 ])。 |
||||||||
串 | substring_index(字符串A,字符串delim,整数计数) | 在计数出现定界符delim之前,从字符串A返回子字符串(从Hive 1.3.0开始)。如果count为正,则返回最后定界符左侧的所有内容(从左侧开始计数)。如果count为负,则返回最后定界符右边的所有内容(从右边开始计数)。搜索delim时,Substring_index执行区分大小写的匹配。例如:substring_index('www.apache.org','。',2)='www.apache'。 | ||||||||
串 |
转换(输入string | char | varchar,从string | char | varchar到string | char | varchar) |
通过将字符串中存在的字符替换为 从Hive 0.14.0开始添加了对Char / varchar的支持。 |
||||||||
串 |
修剪(A串) |
返回由A两端的空格修剪产生的字符串。例如,trim('foobar')结果为'foobar' |
||||||||
二元 |
unbase64(字符串str) |
将参数从基数为64的字符串转换为BINARY。(从Hive 0.12.0开始。) |
||||||||
串 |
大写(字符串A)ucase(字符串A) |
返回将A的所有字符都转换为大写形式的字符串。例如,upper('fOoBaR')的结果为'FOOBAR'。 |
||||||||
串 | initcap(字符串A) | 返回字符串,每个单词的首字母大写,所有其他字母小写。单词由空格分隔。(从Hive 1.1.0开始。) | ||||||||
整型 | levenshtein(字符串A,字符串B) | 返回两个字符串之间的Levenshtein距离(从Hive 1.2.0开始)。例如,levenshtein('kitten','sitting')得出3。 | ||||||||
串 | soundex(字符串A) | 返回字符串的soundex代码(从Hive 1.2.0开始)。例如,soundex('Miller')生成M460。 |
Hive支持以下内置数据屏蔽功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
串 |
mask(字符串str [,字符串高[,字符串低[,字符串编号]]]) |
返回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-####-####。 |
串 | mask_first_n(字符串str [,int n]) | 返回带有str的被屏蔽版本,其中前n个值被屏蔽(从Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_first_n(“ 1234-5678-8765-4321”,4)生成nnnn-5678-8765-4321。 |
串 | mask_last_n(字符串str [,int n]) | 返回带有掩码的最后一个n值的str的掩码版本(从Hive 2.1.0开始)。大写字母转换为“ X”,小写字母转换为“ x”,数字转换为“ n”。例如,mask_last_n(“ 1234-5678-8765-4321”,4)生成1234-5678-8765-nnnn。 |
串 | mask_show_first_n(字符串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。 |
串 | mask_show_last_n(字符串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。 |
串 | mask_hash(string | char | varchar str) | 返回基于str的哈希值(从Hive 2.1.0开始)。哈希是一致的,可用于将跨表的掩码值连接在一起。对于非字符串类型,此函数返回null。 |
返回类型 |
姓名(签名) |
描述 |
---|---|---|
变化 |
java_method(class,method [,arg1 [,arg2 ..]]) |
的同义词 |
变化 |
反射(类,方法[,arg1 [,arg2 ..]]) |
通过使用反射匹配参数签名来调用Java方法。(从Hive 0.7.0开始。)有关示例,请参见反射(通用)UDF。 |
整型 |
杂凑(a1 [,a2 ...]) |
返回参数的哈希值。(从Hive 0.4开始。) |
串 | 当前用户() | 从配置的身份验证器管理器(从Hive 1.2.0开始)返回当前用户名。可以与连接时提供的用户相同,但是与某些身份验证管理器(例如HadoopDefaultAuthenticator)不同。 |
串 | logging_in_user() | 从会话状态返回当前的用户名(从Hive 2.2.0开始)。这是连接到Hive时提供的用户名。 |
串 | current_database() | 返回当前数据库名称(从Hive 0.13.0开始)。 |
串 | md5(字符串/二进制) | 计算字符串或二进制文件的MD5 128位校验和(从Hive 1.3.0开始)。该值以32个十六进制数字的字符串形式返回,如果参数为NULL,则返回NULL。示例:md5('ABC')='902fbdd2b1df0c4f70b4a5d23525e932'。 |
串 | sha1(字符串/二进制) sha(字符串/二进制) |
计算字符串或二进制文件的SHA-1摘要,并以十六进制字符串形式返回值(从Hive 1.3.0开始)。例如:sha1('ABC')='3c01bdbb26f358bab27f267924aa2c9a03fcfdb8'。 |
比金特 | crc32(字符串/二进制) | 计算字符串或二进制参数的循环冗余校验值,并返回bigint值(从Hive 1.3.0开始)。例如:crc32('ABC')= 2743272264。 |
串 | sha2(字符串/二进制,整数) | 计算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'。 |
二元 | aes_encrypt(输入字符串/二进制,密钥字符串/二进制) | 使用AES加密输入(自Hive 1.3.0起)。可以使用128、192或256位的密钥长度。如果安装了Java密码学扩展(JCE)无限强度管辖权策略文件,则可以使用192位和256位密钥。如果任一参数为NULL或密钥长度不是允许的值之一,则返回值为NULL。示例:base64(aes_encrypt('ABC','1234567890123456'))='y6Ss + zCYObpCbgfWfyNWTw =='。 |
二元 | aes_decrypt(输入二进制,密钥字符串/二进制) | 使用AES解密输入(自Hive 1.3.0起)。可以使用128、192或256位的密钥长度。如果安装了Java密码学扩展(JCE)无限强度管辖权策略文件,则可以使用192位和256位密钥。如果任一参数为NULL或密钥长度不是允许的值之一,则返回值为NULL。示例:aes_decrypt(unbase64('y6Ss + zCYObpCbgfWfyNWTw =='),'1234567890123456')='ABC'。 |
串 | 版() | 返回Hive版本(从Hive 2.1.0开始)。该字符串包含2个字段,第一个是内部版本号,第二个是内部散列。示例:“ select version();”可能会返回“ 2.1.0.2.5.0.0-1245 r027527b9c5ce1a3d7d0b6d2e6de2378fb0c39232”。实际结果将取决于您的构建。 |
比金特 | 代理键([write_id_bits,task_id_bits]) | 在向表中输入数据时自动为行生成数字ID。只能用作酸表或仅插入表的默认值。 |
路径
LanguageManual XPathUDF中描述了以下功能:
get_json_object
支持受限版本的JSONPath:
不支持的语法值得注意:
示例: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
|
Hive支持以下内置聚合函数:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
比金特 |
count(*),count(expr),count(DISTINCT expr [,expr ...]) |
count(*)-返回检索到的行总数,包括包含NULL值的行。 count(expr)-返回为其提供的表达式为非NULL的行数。 count(DISTINCT expr [,expr])-返回为其提供的表达式唯一且非NULL的行数。可以使用hive.optimize.distinct.rewrite优化执行。 |
双 |
我(COL),我(DISTINCT col) |
返回组中元素的总和或组中列的不同值的总和。 |
双 |
平均(col),平均(DISTINCT col) |
返回组中元素的平均值或组中列的不同值的平均值。 |
双 |
分钟(col) |
返回组中列的最小值。 |
双 |
最大(col) |
返回组中列的最大值。 |
双 |
方差(col),var_pop(col) |
返回组中数字列的方差。 |
双 |
var_samp(col) |
返回组中数字列的无偏样本方差。 |
双 |
stddev_pop(col) |
返回组中数字列的标准偏差。 |
双 |
stddev_samp(col) |
返回组中数字列的无偏样本标准差。 |
双 |
covar_pop(col1,col2) |
返回组中一对数字列的总体协方差。 |
双 |
covar_samp(col1,col2) |
返回组中一对数字列的样本协方差。 |
双 |
corr(col1,col2) |
返回组中一对数字列的皮尔逊相关系数。 |
双 |
百分位数(BIGINT col,p) |
返回组中列的精确第p 个百分位数(不适用于浮点类型)。p必须在0到1之间。注意:只能为整数值计算真实百分位数。如果您输入的内容不是整数,请使用PERCENTILE_APPROX。 |
数组 |
百分位数(BIGINT col,array(p 1[,p 2 ] ...) |
返回组中列的精确百分位数p 1,p 2,...(不适用于浮点类型)。p i必须在0到1之间。注意:只能为整数值计算真实百分位数。如果您输入的内容不是整数,请使用PERCENTILE_APPROX。 |
双 |
percentile_approx(DOUBLE col,p [,B]) |
返回组中数字列(包括浮点类型)的大约p 个百分位数。B参数控制近似精度,但要以存储为代价。值越高,近似值越好,默认值为10,000。当col中的不同值的数量小于B时,这将给出一个精确的百分位值。 |
数组 |
percentile_approx(DOUBLE col,array(p 1 [,p 2 ] ...)[,B]) |
与上面相同,但是接受并返回一个百分位值数组,而不是单个值。 |
双 | regr_avgx(独立,相关) |
等效于avg(dependent)。从Hive 2.2.0开始。 |
双 | regr_avgy(独立,相关) |
等效于avg(独立)。从Hive 2.2.0开始。 |
双 | regr_count(独立,相关) |
返回用于拟合线性回归线的非空对的数量。从Hive 2.2.0开始。 |
双 | regr_intercept(独立,相关) |
返回线性回归线的y截距,即等式中的b值=独立* a *独立+ b。从Hive 2.2.0开始。 |
双 | regr_r2(独立,相关) |
返回回归的确定系数。从Hive 2.2.0开始。 |
双 | regr_slope(独立,相关) |
返回线性回归线的斜率,即等式= a *独立+ b中a的值。从Hive 2.2.0开始。 |
双 | regr_sxx(独立,相关) |
等效于regr_count(独立,从属)* var_pop(独立)。从Hive 2.2.0开始。 |
双 | regr_sxy(独立,相关) |
等效于regr_count(独立,从属)* covar_pop(独立,从属)。从Hive 2.2.0开始。 |
双 | regr_syy(独立,相关) | 等效于regr_count(独立,从属)* var_pop(独立)。从Hive 2.2.0开始。 |
array <结构{ |
histogram_numeric(col,b) |
使用b个非均匀间隔的bin计算组中数字列的直方图。输出是大小为b的双值(x,y)坐标数组,这些坐标表示箱的中心和高度 |
数组 |
collect_set(col) |
返回消除了重复元素的一组对象。 |
数组 |
collect_list(col) |
返回具有重复项的对象列表。(从Hive 0.13.0开始。) |
整数 | ntile(整数x) | 将有序分区划分为 |
普通的用户定义函数(例如concat())接受单个输入行并输出单个输出行。相反,表生成函数将单个输入行转换为多个输出行。
行集列类型 |
姓名(签名) |
描述 |
---|---|---|
Ť |
爆炸(ARRAY |
将数组分解为多行。返回带有单列(col)的行集,该数组代表数组中每个元素的一行。 |
T 键,T 值 |
爆炸(MAP |
将地图分解为多行。返回一个行集合与两列(键,值),一个行从输入图中的每个键-值对。(从Hive 0.8.0开始。)。 |
整数 | 爆炸(ARRAY |
使用附加的int类型位置列将数组分解为多行(原始数组中项的位置,从0开始)。返回具有两列(pos,val)的行集,该数组中的每个元素一行。 |
T 1,...,T n |
内联(ARRAY |
将结构数组分解为多行。返回具有N列的行集(N =结构中顶级元素的数量),数组中每个结构一行一行。(从Hive0.10开始。) |
T 1,...,T n / r | 堆栈(int r,T 1 V 1,...,T n / rV n) | 将n个值V 1,...,V n分解为r行。每行将有n / r列。r必须是常数。 |
字符串1,...,字符串n |
json_tuple(字符串 jsonStr,字符串 k 1,...,字符串 k n) |
接收JSON字符串和一组n个键,并返回n个值的元组。这是 |
字符串1,...,字符串n |
parse_url_tuple(字符串urlStr,字符串 p 1,...,字符串p n) |
接受URL字符串和一组n个URL部分,并返回n个值的元组。这类似于 |
爆炸(数组)
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;
|
与
|
---|
一个 |
乙 |
C |
爆炸(地图)
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;
|
键
|
值
|
---|---|
一个 | 10 |
乙 | 20 |
C | 30 |
posexplode(数组)
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;
|
发布
|
小时
|
---|---|
0 | 一个 |
1 | 乙 |
2 | C |
内联(结构数组)
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;
|
col1
|
col2
|
col3
|
---|---|---|
一个 | 10 | 2015-01-01 |
乙 | 20 | 2016-02-02 |
堆栈(值)
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;
|
col0
|
col1
|
col2
|
---|---|---|
一个 | 10 | 2015-01-01 |
乙 | 20 | 2016-01-01 |
使用语法“ SELECT udtf(col)AS colAlias ...”有一些限制:
请参阅LanguageManual LateralView,以获取没有这些限制的替代语法。
如果要创建自定义UDTF,也请参见编写 UDTF。
explode()
接受数组(或地图)作为输入,并将数组(地图)的元素作为单独的行输出。UDTF可以在SELECT表达式列表中使用,也可以作为LATERAL VIEW的一部分使用。
作为explode()
在SELECT表达式列表中使用的示例 ,请考虑一个名为myTable的表,该表具有单列(myCol)和两行:
Array |
---|
[100,200,300] |
[400,500,600] |
然后运行查询:
SELECT explode(myCol) AS myNewCol FROM myTable;
|
将产生:
(int)myNewCol |
---|
100 |
200 |
300 |
400 |
500 |
600 |
Maps的用法类似:
SELECT explode(myMap) AS (myMapKey, myMapValue) FROM myMapTable;
|
版
自Hive 0.13.0起可用。参见HIVE-4943。
posexplode()
类似于explode
但不只是返回数组的元素,它还返回元素及其在原始数组中的位置。
作为posexplode()
在SELECT表达式列表中使用的示例 ,请考虑一个名为myTable的表,该表具有单列(myCol)和两行:
Array |
---|
[100,200,300] |
[400,500,600] |
然后运行查询:
SELECT posexplode(myCol) AS pos, myNewCol FROM myTable;
|
将产生:
(int)pos |
(int)myNewCol |
---|---|
1 |
100 |
2 |
200 |
3 |
300 |
1 |
400 |
2 |
500 |
3 |
600 |
Hive 0.7中引入了新的json_tuple()UDTF。它使用一组名称(键)和一个JSON字符串,并使用一个函数返回值的元组。这比调用GET_JSON_OBJECT从单个JSON字符串中检索多个密钥要有效得多。在任何情况下,单个JSON字符串都会被解析多次,如果您解析一次JSON_TUPLE,查询将更加高效。由于JSON_TUPLE是UDTF,因此您需要使用LATERAL VIEW语法才能实现相同的目标。
例如,
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()UDTF与parse_url()相似,但是可以提取给定URL的多个部分,以元组形式返回数据。可以通过将冒号和键附加到partToExtract参数来提取QUERY中特定键的值,例如parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1' ,'QUERY:k1','QUERY:k2')返回值为'v1','v2'的元组。这比多次调用parse_url()更有效。所有输入参数和输出列类型都是字符串。
SELECT b.*
FROM src LATERAL VIEW parse_url_tuple(fullurl, 'HOST' , 'PATH' , 'QUERY' , 'QUERY:id' ) b as host, path, query, query_id LIMIT 1 ;
|
一个典型的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)联系。
功能名称 |
返回类型 |
描述 |
跑步
|
---|---|---|---|
版 |
串 |
提供Hive版本详细信息(软件包内置版本) |
选择版本(); |
buildversion | 串 | 版本功能的扩展,其中包括校验和 | 选择buildversion(); |
UDF的评估方法的上下文是一次一行。像这样的UDF的简单调用
SELECT length(string_col) FROM table_name;
|
将评估作业的地图部分中每个string_col值的长度。在地图端评估UDF的副作用是您无法控制发送到映射器的行的顺序。发送到映射器的文件拆分的序列化顺序与此相同。任何reduce边操作(例如SORT BY,ORDER BY,常规JOIN等)都将应用于UDF输出,就好像它只是表的另一列一样。这很好,因为UDF的评估方法的上下文一次只能排成一行。
如果您想控制将哪些行发送到相同的UDF(并可能以什么顺序),您将敦促在简化阶段对UDF进行评估。这可以通过使用DISTRIBUTE BY,DISTRIBUTE BY + SORT BY,CLUSTER BY来实现。查询示例为:
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的更多信息。另外,您可以使用Hive的Transform功能,使用自定义的reduce脚本来完成相同的任务。这两个选项都将在归约方面进行汇总。
有关如何创建自定义UDF的信息,请参见Hive插件 和创建功能。
选择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;