第五章 Spark-SQL进阶(三)之SQL函数

第五章 Spark-SQL进阶(三)

    • 3.SQL函数
      • 3.1内置函数
        • 3.1.1数学函数
        • 3.1.2集合函数
        • 3.1.3类型转换函数
        • 3.1.4日期函数
        • 3.1.5条件函数
        • 3.1.6字符函数
        • 3.1.7聚合函数
        • 3.1.8表生成函数
        • 3.1.9窗口函数
          • 1.函数分类
          • 2.通用格式
          • 3.编程格式
      • 3.2UDF
      • 3.3UDAF
    • 4.Catalog对象

3.SQL函数

3.1内置函数

3.1.1数学函数

*返回类型* *姓名(签名)* *描述*
DOUBLE round(DOUBLE a) 返回的舍入BIGINTa
DOUBLE round(DOUBLE a, INT d) 返回a四舍五入到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等于或小于的最大值a
BIGINT ceil(DOUBLE a), ceiling(DOUBLE a) 返回等于或大于的最小BIGINT值a
DOUBLE rand(), rand(INT seed) 返回从0到1均匀分布的随机数(逐行变化)。指定种子将确保所生成的随机数序列具有确定性。
DOUBLE exp(DOUBLE a), exp(DECIMAL a) 返回这里是自然对数的底数。Hive 0.13.0中添加了十进制版本。ea``e
DOUBLE ln(DOUBLE a), ln(DECIMAL a) 返回参数的自然对数a。Hive 0.13.0中添加了十进制版本。
DOUBLE log10(DOUBLE a), log10(DECIMAL a) 返回参数的以10为底的对数a。Hive 0.13.0中添加了十进制版本。
DOUBLE log2(DOUBLE a), log2(DECIMAL a) 返回参数的以2为底的对数a。Hive 0.13.0中添加了十进制版本。
DOUBLE log(DOUBLE base, DOUBLE a)log(DECIMAL base, DECIMAL a) 返回base参数的底数对数a。Hive 0.13.0中添加了十进制版本。
DOUBLE pow(DOUBLE a, DOUBLE p), power(DOUBLE a, DOUBLE p) 返回 ap
DOUBLE sqrt(DOUBLE a), sqrt(DECIMAL a) 返回的平方根a。Hive 0.13.0中添加了十进制版本。
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) 如果参数是INTor binaryhex则以STRING十六进制格式返回数字。否则,如果数字为a STRING,它将每个字符转换为十六进制表示形式并返回结果STRING。(见http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_hex,BINARY版本蜂巢0.12.0)。
BINARY unhex(STRING a) 十六进制的倒数。将每对字符解释为十六进制数字,并转换为数字的字节表示形式。(BINARYHive 0.12.0以后的版本,用于返回字符串。)
DOUBLE pi() 返回的值pi
DOUBLE abs(DOUBLE a) 返回绝对值。
INT or DOUBLE pmod(INT a, INT b), pmod(DOUBLE a, DOUBLE b) 返回的正值a mod b
DOUBLE sin(DOUBLE a), sin(DECIMAL a) 返回aa以弧度为单位)的正弦值。Hive 0.13.0中添加了十进制版本。
DOUBLE asin(DOUBLE a), asin(DECIMAL a) 返回a-1 <= a <= 1的反正弦值,否则返回NULL 。Hive 0.13.0中添加了十进制版本。
DOUBLE cos(DOUBLE a), cos(DECIMAL a) 返回aa以弧度为单位)的余弦值。Hive 0.13.0中添加了十进制版本。
DOUBLE acos(DOUBLE a), acos(DECIMAL a) 返回a-1 <= a <= 1 的反余弦值,否则返回NULL 。Hive 0.13.0中添加了十进制版本。
DOUBLE tan(DOUBLE a), tan(DECIMAL a) 返回aa以弧度为单位)的切线。Hive 0.13.0中添加了十进制版本。
DOUBLE atan(DOUBLE a), atan(DECIMAL a) 返回的反正切值a。Hive 0.13.0中添加了十进制版本。
DOUBLE degrees(DOUBLE a), degrees(DECIMAL a) 将的值a从弧度转换为度。Hive 0.13.0中添加了十进制版本。
DOUBLE radians(DOUBLE a), radians(DOUBLE a) 将值a从度转换为弧度。Hive 0.13.0中添加了十进制版本。
INT or DOUBLE positive(INT a), positive(DOUBLE a) 返回a
INT or DOUBLE negative(INT a), negative(DOUBLE a) 返回-a
DOUBLE or INT sign(DOUBLE a), sign(DECIMAL a) 返回符号a“ 1.0”(如果a为正)或“ -1.0”(如果a为负),否则返回“ 0.0”。十进制版本返回INT而不是DOUBLE。Hive 0.13.0中添加了十进制版本。
DOUBLE e() 返回的值e

3.1.2集合函数

*返回类型* *姓名(签名)* *描述*
int size(Map) 返回Map类型中的元素数。
int size(Array) 返回数组类型中的元素数。
array map_keys(Map) 返回包含输入映射键的无序数组。
array map_values(Map) 返回包含输入映射值的无序数组。
boolean array_contains(Array, value) 如果数组包含值,则返回TRUE。
array sort_array(Array) 根据数组元素的自然顺序对输入数组进行升序排序并返回(从0.9.0版本开始)。

3.1.3类型转换函数

返回类型 姓名(签名) 描述
binary binary(string|binary) 将参数转换为二进制。
Expected “=” to follow “type” cast(expr as ) 将表达式expr的结果转换为。例如,cast('1’as BIGINT)会将字符串’1’转换为其整数表示。如果转换不成功,则返回null。如果cast(expr为boolean),则Hive对于非空字符串返回true。

3.1.4日期函数

*返回类型* *姓名(签名)* *描述*
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) yyyy-MM-dd HH:mm:ss使用默认时区和默认语言环境将时间字符串格式转换为Unix时间戳(以秒为单位),如果失败,则返回0:unix_timestamp(‘2009-03-20 11:30:01’)= 1237573801
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: string2.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开始)。源必须是日期,时间戳,时间间隔或可以转换为日期或时间戳的字符串。支持的字段包括:日,星期几,小时,分钟,月,季度,秒,周和年。例子:选择摘录(“ 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(string enddate, string startdate) 返回从开始日期到结束日期的天数:datediff(‘2009-03-01’,‘2009-02-27’)= 2。
pre 2.1.0: string2.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: string2.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’。 add_months(‘2017-12-31 14:15:16’,2,‘YYYY-MM-dd HH:mm:ss’)返回’2018-02-28 14:15:16’。
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,例如:dayname(date)是date_format(date,‘EEEE’)dayofyear(date)是date_format(date,‘D’)

3.1.5条件函数

*返回类型* *姓名(签名)* *描述*
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)。

3.1.6字符函数

*返回类型* *姓名(签名)* *描述*
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’。请注意,此函数可以接受任意数量的输入字符串。
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开始。)
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 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) 返回substrin 中第一次出现的位置str。返回null的如果任一参数是null返回0,如果substr不能在找到str。请注意,这不是基于零的。中的第一个字符的str索引为1。
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’。
string printf(String format, Obj… args) 返回根据do printf样式格式字符串格式化的输入(从Hive 0.9.0开始)。
string quote(String text) 返回带引号的字符串(包括任何单引号HIVE-4.0.0的转义字符)输入项输出量空值空值谁的’谁的’别’别’
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’。
string space(int n) 返回n个空格的字符串。
array split(string str, string pat) 在pat周围拆分str(pat是一个正则表达式)。
map 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 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开始。)

3.1.7聚合函数

*返回类型* *姓名(签名)* *描述*
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) 返回组中一对数字列的皮尔逊相关系数。
array collect_set(col) 返回消除了重复元素的一组对象。
array collect_list(col) 返回具有重复项的对象列表。(从Hive 0.13.0开始。)
INTEGER ntile(INTEGER x) 将有序分区划分为x多个桶,并为分区中的每一行分配一个桶号。这样可以轻松计算三分位数,四分位数,十分位数,百分位数和其他常见的汇总统计信息。(从Hive 0.11.0开始。)

3.1.8表生成函数

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

*行集列类型* *姓名(签名)* *描述*
T explode(ARRAY a) 将数组分解为多行。返回带有单列(col)的行集,该数组代表数组中每个元素的一行。
Tkey,Tvalue explode(MAP m) 将地图分解为多行。返回一个行集合与两列(键,值),一个行从输入图中的每个键-值对。(从Hive 0.8.0开始。)。
int,T posexplode(ARRAY a) 使用附加的int类型位置列将数组分解为多行(原始数组中项的位置,从0开始)。返回具有两列(pos,val)的行集,该数组中的每个元素一行。
T1,…,Tn inline(ARRAY 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个值的元组。这是get_json_objectUDF的一种更有效的版本,因为它只需一次调用就可以获取多个密钥。
string 1,…,stringn parse_url_tuple(string urlStr,string p1,…,string pn) 接受URL字符串和一组n个URL部分,并返回n个值的元组。这类似于parse_url()UDF,但可以一次从URL中提取多个部分。有效的部件名称是:主机,路径,查询,参考,协议,授权,文件,用户信息,查询:<密钥>。
#取随机数rand()
select rand() from t_student;
#求a的阶乘
factorial(INT a)
select factorial(10) from t_student;
#求最大值   max()
greatest(T v1, T v2, ...)
select greatest(10,123,53,34,1,23,502,120) from t_student;
#求最小值
least(T v1, T v2, ...)
select least(10,123,53,34,1,23,502,120) from t_student;
#数学常量e
select e() from t_student;
#数学常量pi
select pi() from t_student;

#返回当前时间
select current_date from t_student;

#如果列中有null值,则返回默认值
NULL
nvl(T value, T default_value)
select id,nvl(name, '无名氏') from t_student;

#对于值的不同判断,取不同的值
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
如果a=b就返回c,a=d就返回e,否则返回f  
如CASE 4 WHEN 5  THEN 5 WHEN 4 THEN 4 ELSE 3 END 将返回4
select id,name,CASE id WHEN 3 THEN '老板' ELSE '员工' END,name from t_student;

#判断某个文件中是否包含某个字符串
in_file(string str, string filename)
select in_file('2,vivo,4000.0','/home/hdfs/phone_data') from t_student;

#通过某个符号切割字符串
split(string str, string pat)
select split('hello,world,briup', ',') from t_student;

#截取字符串
substr(string|binary A, int start, int len)
select substr('ceo-larry', 0, 3) from t_student;

#在某字符串中查找某个子串第一次出现的位置,位置从1开始  indexof
instr(string str, string substr)
select instr('ceo-larry', 'la') from t_student;

#将第一个字符串中的,符合第二个字符串的部分,替换成第三个字符串
translate(string|char|varchar input, string|char|varchar from, string|char|varchar to)
select translate('hello briup', 'briup', 'imut') from t_student;

#比较两个字符串,不同的字符个数
levenshtein(string A, string B)
select levenshtein('testptest', 'briup') from t_student;

#把array中的字符用某个符号拼接起来
stream.collect(Collector.join)
concat_ws(string SEP, array<string>)
select concat_ws('#', split('hello,world,briup', ',')) from t_student;

#先按照班级Id排列,每个班级再按照成绩排序,并给出排名
create table students(id int,name string,score double,classId id)
row format delimited
fields terminated by ','
stored as textfile;

load data local inpath '/Users/angelia/hive/students.txt' into table students;

#窗口函数 row_number() over (partition by 列 order by 列 desc/asc)
select
  classId,
  name,
  score,
  row_number() over (partition by classId order by score desc) as rn
from students;

3.1.9窗口函数

SQL窗口函数的作用:为每条数据显示排名/分析/聚合信息。

1.函数分类

​ 1.ranking 排名类

​ 2.analytic 分析类

​ 3.aggregate 聚合类

思考:计算每个班级最高成绩的学生信息

原始做法:

​ 1.按照班级分组后求出每个班最高分数

​ 2.使用子查询根据每个班的最高分查询对应的学生信息

思考,分两步的原因?

查询的列必须出现在group by语句之后或者组函数内。

注意,使用窗口函数也可以完成以上要求。

借助聚合函数认识窗口函数:

  1. 在使用聚合函数后,会将多行变成一行,而窗口函数是将一行变成多行;第五章 Spark-SQL进阶(三)之SQL函数_第1张图片

  2. 在使用聚合函数后,如果要显示其他的列必须将列加入到group by中,而使用窗口函数后,可以不使用group by,直接将所有信息显示出来。
    第五章 Spark-SQL进阶(三)之SQL函数_第2张图片

  3. 窗口函数适用于在每一行的最后一列添加排名/分析/聚合函数的结果。
    第五章 Spark-SQL进阶(三)之SQL函数_第3张图片

  4. 窗口函数不可以与group by 语句同时出现。

2.通用格式

排名函数([args]) over(partition by … order by …)

rank–为相同组的数据计算排名,如果相同组中排序字段相同,当前行的排名值和前一行相同;如果相同组中排序字段不同,则当前行的排名值为该行在当前组中的行号;因此排名序列会出现间隙。

dense_rank–为相同组内数据计算排名,如果相同组中排序字段相同,当前行的排名值和前一行相同; 如果相同组中排序字段不同,则当前行的排名值为前一行排名值加1;排名序列不会出现间隙。

​ percent_rank–该值的计算公式(组内排名-1)/(组内行数-1),如果组内只有1行,则结果为0。

​ ntile–将组内数据排序然后按照指定的n切分成n个桶,该值为当前行的桶号(桶号从1开始)。

​ row_number–将组内数据排序后,该值为当前行在当前组内的从1开始的递增的唯一序号值。

通用格式:

​ 分析函数([args]) over(partition by … order by …)

​ cume_dist–该值的计算公式为:组内小于等于当前行值的行数/组内总行数

​ first_value–求分组内的第一个值。

​ last_value–求分组内的最后一个值。

​ lag(input, [offset, [default]])–计算组内当前行按照排序字段排序的之前offset行的input列的值,如果offset大于当前窗口(组内当前行之前行数)则返回default值,default值默认为null。

​ lead(input, [offset, [default]])–计算组内当前行按照排序字段排序的之后offset行的input列的值,如果offset大于当前窗口(组内当前行之后行数)则返回default值,default值默认为null。

通用格式:

​ 聚合函数([args]) over(partition by … order by …[rows/range between N preceding and M following])

​ 1.聚合函数可以单独使用,可以不用和over函数连用

​ 2.rows between N preceding and M following 规定了满足条件的行范围为:(当前行-N行,当前行+M行)

​ 3.range between N preceding and M following 规定了满足条件的所有值范围为:(当前行的值-N,当前行的值+M)

测试以下列,理解分别代表什么含义

avg(score) over(partition by clazz  )
avg(score) over(partition by clazz order by score desc)
avg(score) over(partition by clazz order by score desc rows between 1 preceding and 2 following )
avg(score) over(partition by clazz order by score desc range between 1 preceding and 2 following )
3.编程格式

使用编程API的形式调用窗口函数

//1.借助于Column提供的over函数,传入窗口操作
import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._
//2.构建窗口函数
val first_2_now_window = Window.partitionBy("clazz").orderBy($"score".desc)
score.select(
	$"clazz",
	$"score",
	avg($"score").over(first_2_now_window).as("avg_score")
).show

3.2UDF

UDF实现流程:

  • 根据需求定义一个函数;
  • 将该函数注册到Spark中;
  • 在SQL语句或者是代码中使用已经注册了函数。

案例如下:计算员工表中每位员工的年工资。

规则为:12薪+年终奖(年终奖为月工资的20%)

核心代码实现如下:

val yearSalary=(salary:Double) => { salary*12 + (salary*12)*0.2}
val myFun1=org.apache.spark.sql.functions.udf(fun1)
spark.udf.register("yearSalary",myFun1)
emp.select(expr("yearSalary(salary)")).show()

3.3UDAF

  1. 用户自定义类型不安全的聚合函数:扩展抽象类UserDefinedAggregateFunction

定义一个计算用户平均值的UDAF,代码实现如下:

import org.apache.spark.sql.expressions.UserDefinedAggregateFunction

object MyUDF1 extends UserDefinedAggregateFunction{
  //实现抽象方法
}

使用类型不安全UDAF流程:

  • 注册
    • spark.udf.register(“MyUDF1的别名”,MyUDF1 )
  • 使用
    • spark.sql(“select name,MyUDF1的别名 from table”)
  1. 用户自定义类型安全的聚合函数(只支持Scala和Java) :扩展抽象类Aggregator

定义一个计算用户平均值且类型安全的UDAF,代码实现如下:

import org.apache.spark.sql.expressions.Aggregator
object MyUDF2 extends Aggregator[-IN,BUF,OUT]{
  //实现抽象方法
}

使用类型安全UDAF流程:

  • 注册

    • val tc=MyUDF2 .toColumn.name("MyUDF2别名”);
  • 使用

    • ds.select(tc)

4.Catalog对象

Spark SQL2.0版本之后,使用Catalog对象管理元数据。

元数据:比如临时表、用户注册的UDF、持久化的元数据等。

Catalog对象既可以操作Spark SQL元数据,也可以操作Hive元数据。

获取Catalog对象方式:

val catalog=spark.catalog

Catalog常用方法:

  • 与数据库相关
1 currentDatabase 获取当前数据库信息
2 setCurrentDatabase(dbName: String) 设置当前数据库
3 listDatabases 查看所有的数据库信息
4 getDatabase(dbName: String) 获取某数据库的信息
5 databaseExists(dbName: String) 判断某数据库是否存在
  • 与数据表相关
1 listTables 查看当前数据库中所有的表信息
2 listTables(dbName: String) 查看指定数据库中所有的表信息
3 getTable(tableName: String) 获取当前数据库中某表的信息
4 getTable(dbName: String, tableName: String) 获取指定数据库中某表的信息
5 tableExists(tableName: String) 判断当前数据库中某表是否存在
6 tableExists(dbName: String, tableName: String) 判断指定数据库中某表是否存在
7 createTable(tableName: String, path: String) 创建外部表
8 createTable(tableName: String, path: String, source: String) 创建外部表并指定数据存储格式
9 refreshTable(tableName: String) 更新表
10 refreshByPath(path: String) 更新外部表
11 recoverPartitions(tableName: String) 重分区(只适用与分区表,视图不适用)
  • 与列相关
1 listColumns(tableName: String) 查看当前数据库中某表的列信息
2 listColumns(dbName: String, tableName: String) 查看指定数据库中某表的列信息
  • 与函数相关
1 listFunctions() 查看当前数据库中所有的函数
2 listFunctions(dbName: String) 查看指定数据库中所有的函数
3 getFunction(functionName: String) 获取当前数据库中的某函数对象
4 getFunction(dbName: String, functionName: String) 获取指定数据库中到的某函数对象
5 functionExists(functionName: String) 判断当前数据库中某函数是否存在
6 functionExists(dbName: String, functionName: String) 判断指定数据库中某函数是否存在v
  • 与缓存相关
1 cacheTable(tableName[,storageLevel=MEMORY_ONLY]) 缓存表,并指定缓存级别
2 uncacheTable(tableName: String) 从内存中移除表数据
3 clearCache() 清除内存中所有的缓存
4 isCached(tableName: String) 查看某一张表是否缓存在内存中

注意,缓存的生命周期:与驱动器程序的生命周期一致;

  • 与视图相关
1 dropTempView(viewName: String) 删除临时视图
2 dropGloablTempView(viewName: String) 删除全局临时视图

你可能感兴趣的:(Spark,Scala,大数据,spark)