关系运算符
以下运算符比较传递的操作数,并根据操作数之间的比较是否成立来生成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 <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。 |
A [NOT] BETWEEN B AND C | 所有原始类型 | 如果A,B或C为NULL,则为NULL;如果A大于或等于B,而A小于或等于C,则为TRUE,否则为FALSE。可以使用NOT关键字将其反转。(从0.9.0版开始。) |
A IS NULL | 所有类型 | 如果表达式A的计算结果为NULL,则为TRUE,否则为FALSE。 |
A IS NOT NULL | 所有类型 | 如果表达式A的计算结果为NULL,则为FALSE,否则为TRUE。 |
A IS [NOT] (TRUE|FALSE) | 布尔类型 | 仅当A满足条件时评估为TRUE。(因为:3.0.0 )注意:NULL为UNKNOWN,因此(UNKNOWN IS TRUE)和(UNKNOWN IS FALSE)都评估为FALSE。 |
A [NOT] LIKE B | 字符串 | 如果A或B为NULL,则为NULL,如果字符串A与SQL简单正则表达式B匹配,则为TRUE,否则为FALSE。逐个字符进行比较。B中的_字符匹配A中的任何字符(类似于posix正则表达式中的。),而B中的%字符匹配A中任意数目的字符(类似于posix正则表达式中的。*)。例如,像'foo'这样的'foobar'的值为FALSE,而像'foo_ _ _'这样的'foobar'的值为TRUE,而'foobar'这样的'foo%'的值为。 |
A RLIKE 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 | B | 所有数字类型 | 给出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。 |
NOT A | 布尔值 | 如果A为FALSE,则为TRUE;如果A为NULL,则为NULL。否则为FALSE。 |
! A | 布尔值 | 与NOT A相同。 |
A IN (val1, val2, ...) | 布尔值 | 如果A等于任何值,则为TRUE。从Hive开始,IN语句支持0.13 子查询。 |
A NOT IN (val1, val2, ...) | 布尔值 | 如果A不等于任何值,则为TRUE。从Hive开始,NOT IN语句支持0.13 子查询。 |
[NOT] EXISTS (subquery) |
| 如果子查询返回至少一行,则为TRUE。从Hive 0.13开始受支持。 |
字符串运算符
操作员 |
操作数类型 |
描述 |
---|---|---|
A || B | 字符串 | 连接操作数-的简写 |
复杂类型构造函数
以下函数构造复杂类型的实例。
构造函数 |
操作数 |
描述 |
---|---|---|
map | (key1,value1,key2,value2,...) | 使用给定的键/值对创建一个映射。 |
struct | (val1,val2,val3,...) | 用给定的字段值创建一个结构。结构字段名称将为col1,col2,...。 |
named_struct | (name1, val1, name2, val2, ...) | 用给定的字段名称和值创建一个结构。(从Hive 0.8.0开始。) |
array | (val1,val2,...) | 用给定的元素创建一个数组。 |
create_union | (tag, val1, val2, ...) | 使用tag参数指向的值创建联合类型。 |
复杂类型上的运算符
以下运算符提供了访问复杂类型中的元素的机制。
操作员 |
操作数类型 |
描述 |
---|---|---|
A[n] | A是一个数组,n是一个整数 | 返回数组A中的第n个元素。第一个元素的索引为0。例如,如果A是包含['foo','bar']的数组,则A [0]返回'foo',而A [1]返回'酒吧'。 |
M[key] | M是Map <K,V>并且键的类型为K | 返回与映射中的键对应的值。例如,如果M是包含{'f'->'foo','b'->'bar','all'->'foobar'}的映射,则M ['all']返回'foobar'。 |
S.x | S是一个struct | 返回S的x字段。例如,对于结构foobar {int foo,int bar},foobar.foo返回存储在结构的foo字段中的整数。 |
内建功能
数学函数
Hive支持以下内置数学函数;当参数为NULL时,大多数返回NULL:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
DOUBLE | round(DOUBLE a) | 返回的舍入 |
DOUBLE | round(DOUBLE a, INT d) | 返回 |
DOUBLE | bround(DOUBLE a) | 返回a 使用HALF_EVEN舍入模式的舍入后的BIGINT值(从Hive 1.3.0,2.0.0开始)。也称为高斯舍入或银行家舍入。例如:bround(2.5)= 2,bround(3.5)= 4。 |
DOUBLE | bround(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。 |
BIGINT | floor(DOUBLE a) | 返回 |
BIGINT | ceil(DOUBLE a), ceiling(DOUBLE a) | 返回等于或大于的最小BIGINT值 |
DOUBLE | rand(), rand(INT seed) | 返回从0到1均匀分布的随机数(逐行变化)。指定种子将确保所生成的随机数序列具有确定性。 |
DOUBLE | exp(DOUBLE a), exp(DECIMAL a) | 返回这里是自然对数的底数。Hive 0.13.0中添加了十进制版本。 |
DOUBLE | ln(DOUBLE a), ln(DECIMAL a) | 返回参数的自然对数 |
DOUBLE | log10(DOUBLE a), log10(DECIMAL a) | 返回参数的以10为底的对数 |
DOUBLE | log2(DOUBLE a), log2(DECIMAL a) | 返回参数的以2为底的对数 |
DOUBLE | log(DOUBLE base, DOUBLE a) log(DECIMAL base, DECIMAL a) | 返回 |
DOUBLE | pow(DOUBLE a, DOUBLE p), power(DOUBLE a, DOUBLE p) | 返回 |
DOUBLE | sqrt(DOUBLE a), sqrt(DECIMAL a) | 返回的平方根 |
STRING | bin(BIGINT a) | 以二进制格式返回数字(请参见http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_bin)。 |
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) | 将数字从给定的基数转换为另一个(请参见http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv)。 |
DOUBLE | abs(DOUBLE a) | 返回绝对值。 |
INT or DOUBLE | pmod(INT a, INT b), pmod(DOUBLE a, DOUBLE b) | 返回的正值 |
DOUBLE | sin(DOUBLE a), sin(DECIMAL a) | 返回 |
DOUBLE | asin(DOUBLE a), asin(DECIMAL a) | 返回 |
DOUBLE | cos(DOUBLE a), cos(DECIMAL a) | 返回 |
DOUBLE | acos(DOUBLE a), acos(DECIMAL a) | 返回 |
DOUBLE | tan(DOUBLE a), tan(DECIMAL a) | 返回 |
DOUBLE | atan(DOUBLE a), atan(DECIMAL a) | 返回的反正切值 |
DOUBLE | degrees(DOUBLE a), degrees(DECIMAL a) | 将的值 |
DOUBLE | radians(DOUBLE a), radians(DOUBLE a) | 将值 |
INT or DOUBLE | positive(INT a), positive(DOUBLE a) | 返回 |
INT or DOUBLE | negative(INT a), negative(DOUBLE a) | 返回 |
DOUBLE or INT | sign(DOUBLE a), sign(DECIMAL a) | 返回符号 |
DOUBLE | e() | 返回的值 |
DOUBLE | pi() | 返回的值 |
BIGINT | factorial(INT a) | 返回a (从Hive 1.2.0开始)的阶乘。有效a 值为[0..20]。 |
DOUBLE | cbrt(DOUBLE a) | 返回a double值的多维数据集根(从Hive 1.2.0开始)。 |
INT BIGINT | shiftleft(TINYINT|SMALLINT|INT a, INT b) shiftleft(BIGINT a, INT b) | 按位左移(从Hive 1.2.0开始)。 为tinyint,smallint和int返回int |
INT BIGINT | shiftright(TINYINT|SMALLINT|INT a, INT b) shiftright(BIGINT a, INT b) | 按位右移(从Hive 1.2.0开始)。 为tinyint,smallint和int返回int |
INT BIGINT | shiftrightunsigned(TINYINT|SMALLINT|INTa, INT b), shiftrightunsigned(BIGINT a, INT b) | 按位无符号右移(从Hive 1.2.0开始)。向右移动位置。 为tinyint,smallint和int返回int |
T | greatest(T v1, T v2, ...) | 返回值列表的最大值(从Hive 1.1.0开始)。修复了当一个或多个参数为NULL且放宽了严格的类型限制(与“>”运算符一致时,从Hive 2.0.0开始)时返回NULL的问题。 |
T | least(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 <min_value,则返回1,如果expr> max_value,则返回num_buckets + 1。请参阅https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions214.htm (自Hive 3.0.0起) |
十进制数据类型的数学函数和运算符
Version
Hive 0.11.0(HIVE-2693)中引入了十进制数据类型。
所有常规算术运算符(例如+,-,*,/)和相关的数学UDF(Floor,Ceil,Round等)都已更新为处理十进制类型。有关支持的UDF的列表,请参阅数学的UDF在蜂巢的数据类型。
收集功能
Hive支持以下内置收集功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
int | size(Map<K.V>) | 返回地图类型中的元素数。 |
int | size(Array<T>) | 返回数组类型中的元素数。 |
array<K> | map_keys(Map<K.V>) | 返回包含输入映射键的无序数组。 |
array<V> | map_values(Map<K.V>) | 返回包含输入映射值的无序数组。 |
boolean | array_contains(Array<T>, value) | 如果数组包含值,则返回TRUE。 |
array<t> | sort_array(Array<T>) |
类型转换功能
Hive支持以下类型转换功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
binary | binary(string|binary) | 将参数转换为二进制。 |
Expected "=" to follow "type" | cast(expr as <type>) | 将表达式expr的结果转换为<type>。例如,cast('1'as BIGINT)会将字符串'1'转换为其整数表示。如果转换不成功,则返回null。如果cast(expr为boolean),则Hive对于非空字符串返回true。 |
日期功能
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时间戳。此函数不是确定性的,其值在查询执行范围内也不是固定的,因此会阻止对查询的适当优化-自2.0版以来已弃用此函数,而推荐使用CURRENT_TIMESTAMP常量。 |
bigint | unix_timestamp(string date) |
|
bigint | unix_timestamp(string date, string pattern) | 将具有给定模式的时间字符串(请参阅[ http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html])转换为Unix时间戳(以秒为单位),如果失败,则返回0:unix_timestamp('2009 -03-20','yyyy-MM-dd')= 1237532400。 |
pre 2.1.0: string 2.1.0 on: date | to_date(string timestamp) | 返回时间戳字符串(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(string date) | 返回日期或时间戳字符串的年份部分: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(“ 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 | extract(field FROM source) | 从源中检索字段,例如天或小时(从Hive 2.2.0开始)。源必须是日期,时间戳,时间间隔或可以转换为日期或时间戳的字符串。支持的字段包括:日,星期几,小时,分钟,月,季度,秒,周和年。 例子:
|
int | datediff(string enddate, string startdate) | 返回从开始日期到结束日期的天数:datediff('2009-03-01','2009-02-27')= 2。 |
pre 2.1.0: string 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: string 2.1.0 on: date | date_sub(date/timestamp/string startdate, tinyint/smallint/int days) | 减去开始日期的天数: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, string timezone) | 将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。 |
timestamp | to_utc_timestamp({any primitive type} ts, string timezone) | 将给定时区中的时间戳*转换为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(string start_date, 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'。 |
string | last_day(string date) | 返回日期所属月份的最后一天(从Hive 1.1.0开始)。date是格式为“ yyyy-MM-dd HH:mm:ss”或“ yyyy-MM-dd”的字符串。日期的时间部分将被忽略。 |
string | next_day(string start_date, string 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(string date, string format) | 返回截断为格式指定单位的日期(从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(date/timestamp/string ts, string 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,例如:
|
条件函数
返回类型 |
姓名(签名) |
描述 |
---|---|---|
T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 当testCondition为true时返回valueTrue,否则返回valueFalseOrNull。 |
boolean | isnull( a ) | 如果a为NULL,则返回true,否则返回false。 |
boolean | isnotnull ( a ) | 如果a不为NULL,则返回true,否则返回false。 |
T | nvl(T value, T default_value) | 如果value为null,则返回默认值,否则返回值(从HIve 0.11开始)。 |
T | COALESCE(T v1, T v2, ...) | 返回第一个不为NULL的v,如果所有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。 |
T | nullif( a, b ) | 如果a = b,则返回NULL。否则返回a (从Hive 2.3.0开始)。 简写:CASE,当a = b时为NULL,否则为a |
void | assert_true(boolean condition) | 如果'condition'不为true,则引发异常,否则返回null(从Hive 0.8.0开始)。例如,选择assert_true(2 <1)。 |
字符串函数
Hive支持以下内置的String函数:
返回类型 |
姓名(签名) |
描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
int | ascii(string str) | 返回str的第一个字符的数值。 | ||||||||
string | base64(binary bin) | 将参数从二进制转换为基本64字符串(从Hive 0.12.0开始)。 | ||||||||
int | character_length(string str) | 返回str中包含的UTF-8字符数(从Hive 2.2.0开始)。函数char_length是该函数的简写。 | ||||||||
string | chr(bigint|double A) | 返回具有与A等效的二进制值的ASCII字符(从Hive 1.3.0和2.1.0开始)。如果A大于256,则结果等于chr(A%256)。示例:选择chr(88); 返回“ X”。 | ||||||||
string | concat(string|binary A, string|binary B...) | 返回按顺序串联作为参数传入的字符串或字节所得到的字符串或字节。例如,concat('foo','bar')的结果为'foobar'。请注意,此函数可以接受任意数量的输入字符串。 | ||||||||
array<struct<string,double>> | context_ngrams(array<array<string>>, array<string>, int K, int pf) | 给定字符串“ context”,从一组标记化语句返回前k个上下文N-gram。有关更多信息,请参见StatisticsAndDataMining。 | ||||||||
string | concat_ws(string SEP, string A, string B...) | 与上面的concat()类似,但具有自定义分隔符SEP。 | ||||||||
string | concat_ws(string SEP, array<string>) | 就像上面的concat_ws()一样,但是采用字符串数组。(从Hive 0.9.0开始) | ||||||||
string | decode(binary bin, string charset) | 使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF-16BE”,“ UTF-16LE”,“ UTF- 16')。如果任一参数为null,则结果也将为null。(从Hive 0.12.0开始。) | ||||||||
string | elt(N int,str1 string,str2 string,str3 string,...) | 返回索引号处的字符串。例如elt(2,'hello','world')返回'world'。如果N小于1或大于参数个数,则返回NULL。 (请参阅https://dev.mysql.com/doc/refman/5.7/zh-CN/string-functions.html#function_elt) | ||||||||
binary | encode(string src, string charset) | 使用提供的字符集(“ US-ASCII”,“ ISO-8859-1”,“ UTF-8”,“ UTF-16BE”,“ UTF-16LE”,“ UTF- 16')。如果任一参数为null,则结果也将为null。(从Hive 0.12.0开始。) | ||||||||
int | field(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) | ||||||||
int | find_in_set(string str, string strList) | 返回str在strList中的第一次出现,其中strList是一个逗号分隔的字符串。如果任一参数为null,则返回null。如果第一个参数包含逗号,则返回0。例如,find_in_set('ab','abc,b,ab,c,def')返回3。 | ||||||||
string | format_number(number x, int d) | 将数字X格式化为'#,###,###。##'之类的格式,四舍五入到D小数位,然后将结果作为字符串返回。如果D为0,则结果没有小数点或小数部分。(由于蜂房的0.10.0 ;臭虫以固定在浮子类型蜂房0.14.0,在加入十进制型支撑蜂巢0.14.0) | ||||||||
string | get_json_object(string json_string, string path) | 根据指定的json路径从json字符串中提取json对象,并返回提取的json对象的json字符串。如果输入的json字符串无效,它将返回null。注意:json路径只能包含字符[0-9a-z_],即不能包含大写或特殊字符。另外,键*不能以数字开头。*这是由于对Hive列名的限制。 | ||||||||
boolean | in_file(string str, string filename) | 如果字符串str在文件名中显示为整行,则返回true。 | ||||||||
int | instr(string str, string substr) | 返回 | ||||||||
int | length(string A) | 返回字符串的长度。 | ||||||||
int | locate(string substr, string str[, int pos]) | 返回在位置pos之后的str中第一次出现substr的位置。 | ||||||||
string | lower(string A) lcase(string A) | 返回将B的所有字符都转换为小写形式的字符串。例如,lower('fOoBaR')会导致'foobar'。 | ||||||||
string | lpad(string str, int len, string pad) | 返回str,在其左边填充pad,长度为len。如果str大于len,则返回值缩短为len个字符。如果填充字符串为空,则返回值为null。 | ||||||||
string | ltrim(string A) | 返回从A的开头(左侧)起修剪空格所得的字符串。例如,ltrim('foobar')的结果为'foobar'。 | ||||||||
array<struct<string,double>> | ngrams(array<array<string>>, int N, int K, int pf) | 从一组标记化的句子中返回前k个N-gram,例如句子()UDAF返回的句子。有关更多信息,请参见StatisticsAndDataMining。 | ||||||||
int | octet_length(string str) | 返回以UTF-8编码保存字符串str所需的八位字节数(从Hive 2.2.0开始)。请注意,octet_length(str)可以大于character_length(str)。 | ||||||||
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) | 返回根据do printf样式格式字符串格式化的输入(从Hive 0.9.0开始)。 | ||||||||
string | quote(String text) | 返回带引号的字符串(包括任何单引号HIVE-4.0.0的转义字符)
| ||||||||
string | regexp_extract(string subject, string pattern, int index) | 返回使用模式提取的字符串。例如,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。 | ||||||||
string | regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) | 返回将替换INITIAL_STRING中所有与PATTERN中定义的Java正则表达式语法匹配的子字符串替换为REPLACEMENT的实例所产生的字符串。例如,regexp_replace(“ foobar”,“ oo | ar”,“”)返回'fb'。请注意,使用预定义的字符类时必须格外小心:使用'\ s'作为第二个参数将与字母s匹配;'\\ s'是匹配空格等所必需的。 | ||||||||
string | repeat(string str, int n) | 重复str n次。 | ||||||||
string | replace(string A, string OLD, string NEW) | 返回字符串A,其中所有不重叠的OLD都替换为NEW(从Hive 1.3.0和2.1.0开始)。示例:选择replace(“ ababab”,“ abab”,“ Z”); 返回“ Zab”。 | ||||||||
string | reverse(string A) | 返回反转的字符串。 | ||||||||
string | rpad(string str, int len, string pad) | 返回str,右用pad填充到len的长度。如果str大于len,则返回值缩短为len个字符。如果填充字符串为空,则返回值为null。 | ||||||||
string | rtrim(string A) | 返回从A的结尾(右侧)修剪空格所得到的字符串。例如,rtrim('foobar')结果为'foobar'。 | ||||||||
array<array<string>> | sentences(string str, string lang, string locale) | 将一串自然语言文本标记为单词和句子,其中每个句子在适当的句子边界处断开并作为单词数组返回。“ lang”和“ locale”是可选参数。例如,句子(“ Hello there!你好吗?”)返回((“ 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]) | 使用两个定界符将文本拆分为键/值对。Delimiter1将文本分成KV对,Delimiter2将每个KV对分开。默认的定界符是','代表定界符1,':'代表定界符2。 | ||||||||
string | substr(string|binary A, int start) substring(string|binary A, int start) | 返回A的字节数组的子字符串或切片,从字符串的起始位置开始到字符串A的结尾。例如,substr('foobar',4)的结果为'bar'(请参见[ http://dev.mysql.com /doc/refman/5.0/zh-CN/string-functions.html#function_substr ])。 | ||||||||
string | substr(string|binary A, int start, int len) substring(string|binary A, int start, int len) | 从长度为len的起始位置返回A的字节数组的子字符串或切片。例如,substr('foobar',4,1)的结果为'b'(请参阅[ http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr ])。 | ||||||||
string | substring_index(string A, string delim, int count) | 在计数出现定界符delim之前,从字符串A返回子字符串(从Hive 1.3.0开始)。如果count为正,则返回最后定界符左侧的所有内容(从左侧开始计数)。如果count为负,则返回最后定界符右边的所有内容(从右边开始计数)。搜索delim时,Substring_index执行区分大小写的匹配。例如:substring_index('www.apache.org','。',2)='www.apache'。 | ||||||||
string | translate(string|char|varchar input, string|char|varchar from, string|char|varchar to) | 通过将字符串中存在的字符替换为 从Hive 0.14.0开始添加了对Char / varchar的支持。 | ||||||||
string | trim(string A) | 返回由A两端的空格修剪产生的字符串。例如,trim('foobar')结果为'foobar' | ||||||||
binary | unbase64(string str) | 将参数从基数为64的字符串转换为BINARY。(从Hive 0.12.0开始。) | ||||||||
string | upper(string A) ucase(string A) | 返回将A的所有字符都转换为大写形式的字符串。例如,upper('fOoBaR')的结果为'FOOBAR'。 | ||||||||
string | initcap(string A) | 返回字符串,每个单词的首字母大写,所有其他字母小写。单词由空格分隔。(从Hive 1.1.0开始。) | ||||||||
int | levenshtein(string A, string B) | 返回两个字符串之间的Levenshtein距离(从Hive 1.2.0开始)。例如,levenshtein('kitten','sitting')得出3。 | ||||||||
string | soundex(string A) | 返回字符串的soundex代码(从Hive 1.2.0开始)。例如,soundex('Miller')生成M460。 |
数据屏蔽功能
Hive支持以下内置数据屏蔽功能:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
string | mask(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-####-####。 |
string | mask_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。 |
string | mask_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。 |
string | mask_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。 |
string | mask_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。 |
string | mask_hash(string|char|varchar str) | 返回基于str的哈希值(从Hive 2.1.0开始)。哈希是一致的,可用于将跨表的掩码值连接在一起。对于非字符串类型,此函数返回null。 |
Misc. 功能
返回类型 |
姓名(签名) |
描述 |
---|---|---|
varies | java_method(class, method[, arg1[, arg2..]]) | 的同义词 |
varies | reflect(class, method[, arg1[, arg2..]]) | |
int | hash(a1[, a2...]) | 返回参数的哈希值。(从Hive 0.4开始。) |
string | current_user() | 从配置的身份验证器管理器(从Hive 1.2.0开始)返回当前用户名。可以与连接时提供的用户相同,但是与某些身份验证管理器(例如HadoopDefaultAuthenticator)不同。 |
string | logged_in_user() | 从会话状态返回当前的用户名(从Hive 2.2.0开始)。这是连接到Hive时提供的用户名。 |
string | current_database() | 返回当前数据库名称(从Hive 0.13.0开始)。 |
string | md5(string/binary) | 计算字符串或二进制文件的MD5 128位校验和(从Hive 1.3.0开始)。该值以32个十六进制数字的字符串形式返回,如果参数为NULL,则返回NULL。示例:md5('ABC')='902fbdd2b1df0c4f70b4a5d23525e932'。 |
string | sha1(string/binary) sha(string/binary) | 计算字符串或二进制文件的SHA-1摘要,并以十六进制字符串形式返回值(从Hive 1.3.0开始)。例如:sha1('ABC')='3c01bdbb26f358bab27f267924aa2c9a03fcfdb8'。 |
bigint | crc32(string/binary) | 计算字符串或二进制参数的循环冗余校验值,并返回bigint值(从Hive 1.3.0开始)。例如:crc32('ABC')= 2743272264。 |
string | sha2(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'。 |
binary | aes_encrypt(input string/binary, key string/binary) | 使用AES加密输入(自Hive 1.3.0起)。可以使用128、192或256位的密钥长度。如果安装了Java密码学扩展(JCE)无限强度管辖权策略文件,则可以使用192位和256位密钥。如果任一参数为NULL或密钥长度不是允许的值之一,则返回值为NULL。示例:base64(aes_encrypt('ABC','1234567890123456'))='y6Ss + zCYObpCbgfWfyNWTw =='。 |
binary | aes_decrypt(input binary, key string/binary) | 使用AES解密输入(自Hive 1.3.0起)。可以使用128、192或256位的密钥长度。如果安装了Java密码学扩展(JCE)无限强度管辖权策略文件,则可以使用192位和256位密钥。如果任一参数为NULL或密钥长度不是允许的值之一,则返回值为NULL。示例:aes_decrypt(unbase64('y6Ss + zCYObpCbgfWfyNWTw =='),'1234567890123456')='ABC'。 |
string | version() | 返回Hive版本(从Hive 2.1.0开始)。该字符串包含2个字段,第一个是内部版本号,第二个是内部散列。示例:“ select version();”可能会返回“ 2.1.0.2.5.0.0-1245 r027527b9c5ce1a3d7d0b6d2e6de2378fb0c39232”。实际结果将取决于您的构建。 |
bigint | surrogate_key([write_id_bits, task_id_bits]) | 在向表中输入数据时自动为行生成数字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对象的字段:
|
内置汇总功能(UDAF)
Hive支持以下内置聚合函数:
返回类型 |
姓名(签名) |
描述 |
---|---|---|
BIGINT | count(*), 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) | 返回组中数字列的无偏样本方差。 |
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之间。注意:只能为整数值计算真实百分位数。如果您输入的内容不是整数,请使用PERCENTILE_APPROX。 |
array<double> | percentile(BIGINT col, array(p1 [, p2]...)) | 返回组中列的精确百分位数p 1,p 2,...(不适用于浮点类型)。p i必须在0到1之间。注意:只能为整数值计算真实百分位数。如果您输入的内容不是整数,请使用PERCENTILE_APPROX。 |
DOUBLE | percentile_approx(DOUBLE col, p [, B]) | 返回组中数字列(包括浮点类型)的大约p 个百分位数。B参数控制近似精度,但要以存储为代价。值越高,近似值越好,默认值为10,000。当col中的不同值的数量小于B时,这将给出一个精确的百分位值。 |
array<double> | percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) | 与上面相同,但是接受并返回一个百分位值数组,而不是单个值。 |
double | regr_avgx(independent, dependent) | 等效于avg(dependent)。从Hive 2.2.0开始。 |
double | regr_avgy(independent, dependent) | 等效于avg(独立)。从Hive 2.2.0开始。 |
double | regr_count(independent, dependent) | 返回用于拟合线性回归线的非空对的数量。从Hive 2.2.0开始。 |
double | regr_intercept(independent, dependent) | 返回线性回归线的y截距,即等式中的b值=独立* a *独立+ b。从Hive 2.2.0开始。 |
double | regr_r2(independent, dependent) | 返回回归的确定系数。从Hive 2.2.0开始。 |
double | regr_slope(independent, dependent) | 返回线性回归线的斜率,即等式= a *独立+ b中a的值。从Hive 2.2.0开始。 |
double | regr_sxx(independent, dependent) | 等效于regr_count(独立,从属)* var_pop(独立)。从Hive 2.2.0开始。 |
double | regr_sxy(independent, dependent) | 等效于regr_count(独立,从属)* covar_pop(独立,从属)。从Hive 2.2.0开始。 |
double | regr_syy(independent, dependent) | 等效于regr_count(独立,从属)* var_pop(独立)。从Hive 2.2.0开始。 |
array<struct { | histogram_numeric(col, b) | 使用b个非均匀间隔的bin计算组中数字列的直方图。输出是大小为b的双值(x,y)坐标数组,这些坐标表示箱的中心和高度 |
array | collect_set(col) | 返回消除了重复元素的一组对象。 |
array | collect_list(col) | 返回具有重复项的对象列表。(从Hive 0.13.0开始。) |
INTEGER | ntile(INTEGER x) | 将有序分区划分为 |
内置表生成函数(UDTF)
普通的用户定义函数(例如concat())接受单个输入行并输出单个输出行。相反,表生成函数将单个输入行转换为多个输出行。
行集列类型 |
姓名(签名) |
描述 |
---|---|---|
T | explode(ARRAY<T> a) | 将数组分解为多行。返回带有单列(col)的行集,该数组代表数组中每个元素的一行。 |
Tkey,Tvalue | explode(MAP<Tkey,Tvalue> m) | 将地图分解为多行。返回一个行集合与两列(键,值),一个行从输入图中的每个键-值对。(从Hive 0.8.0开始。)。 |
int,T | posexplode(ARRAY<T> a) | 使用附加的int类型位置列将数组分解为多行(原始数组中项的位置,从0开始)。返回具有两列(pos,val)的行集,该数组中的每个元素一行。 |
T1,...,Tn | inline(ARRAY<STRUCT<f1:T1,...,fn:Tn>> a) | 将结构数组分解为多行。返回具有N列的行集(N =结构中顶级元素的数量),数组中每个结构一行一行。(从Hive0.10开始。) |
T1,...,Tn/r | stack(int r,T1 V1,...,Tn/r Vn) | 将n个值V 1,...,V n分解为r行。每行将有n / r列。r必须是常数。 |
string1,...,stringn | json_tuple(string jsonStr,string k1,...,string kn) | 接收JSON字符串和一组n个键,并返回n个值的元组。这是 |
string 1,...,stringn | parse_url_tuple(string urlStr,string p1,...,string pn) | 接受URL字符串和一组n个URL部分,并返回n个值的元组。这类似于 |
使用范例
爆炸(数组)
|
col |
---|
A |
B |
C |
explode (map)
|
key | value |
---|---|
A | 10 |
B | 20 |
C | 30 |
posexplode(array)
|
pos | val |
---|---|
0 | A |
1 | B |
2 | C |
inline (array of structs)
|
col1 | col2 | col3 |
---|---|---|
A | 10 | 2015-01-01 |
B | 20 | 2016-02-02 |
stack (values)
|
col0 | col1 | col2 |
---|---|---|
A | 10 | 2015-01-01 |
B | 20 | 2016-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,也请参见编写 UDTF。
explode
explode()
接受数组(or a map)作为输入,并将array (map)的元素作为单独的行输出。UDTF可以在SELECT表达式列表中使用,也可以作为LATERAL VIEW的一部分使用。
作为explode()
在SELECT表达式列表中使用的示例 ,请考虑一个名为myTable的表,该表具有单列(myCol)和两行:
Array <int> myCol |
---|
[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;
|
posexplode
Version
自Hive 0.13.0起可用。参见HIVE-4943。
posexplode()
类似于explode
但不只是返回数组的元素,它还返回元素及其在原始数组中的位置。
作为posexplode()
在SELECT表达式列表中使用的示例 ,请考虑一个名为myTable的表,该表具有单列(myCol)和两行:
Array <int> myCol |
---|
[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 |
json_tuple
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
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 ;
|
GROUPing and SORTing on f(column)
一个典型的OLAP模式是您有一个timestamp列,并且您希望按每日或其他粒度较小的日期窗口(而不是按秒)进行分组。因此,您可能要select concat(year(dt),month(dt)) and then group on that 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)联系。
实用功能
功能名称 |
返回类型 |
描述 |
跑步
|
---|---|---|---|
version | String | 提供Hive版本详细信息(软件包内置版本) | select version(); |
buildversion | String | 版本功能的扩展,其中包括校验和 | select buildversion(); |
UDF内部
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
有关如何创建自定义UDF的信息,请参见Hive插件 和创建功能。
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;