HiveQL函数10—表生成函数(UDTF)

1.explode(ARRAY<T> a)

返回值:T
功能:将数组分解为多行。返回具有单个列(col)的行集,数组中每个元素为一行。
示例:

> select explode(array('A','B','C')) as col;
+------+
| col  |
+------+
| A    |
| B    |
| C    |
+------+

2.explode(MAP<Tkey,Tvalue> m)

返回值:Tkey,Tvalue
功能:将MAP分解为多行。返回具有2个列(key,value)的行集,map中每组KV对为一行。
示例:

> select explode(map('A',10,'B',20,'C',30)) as (key,value);
+------+--------+
| key  | value  |
+------+--------+
| A    | 10     |
| B    | 20     |
| C    | 30     |
+------+--------+

3.posexplode(ARRAY<T> a)

返回值:int,T
功能:使用int类型的附加位置列(元素在原始数组中从0开始的位置)将数组分解为多行。返回具有2个列(pos,val)的行集,数组中每个元素为一行。
示例:

> select posexplode(array('A','B','C')) as (pos,val);
+------+------+
| pos  | val  |
+------+------+
| 0    | A    |
| 1    | B    |
| 2    | C    |
+------+------+

4.inline(ARRAY<STRUCT<f1:T1,…,fn:Tn>> a)

返回值:T1,…,Tn
功能:将结构体类型的数组分解为多行。返回具有N(N为结构体中顶级元素的个数)个列的行集,数组中每个结构体为一行。
示例:

> select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) as (col1,col2,col3);
+-------+-------+-------------+
| col1  | col2  |    col3     |
+-------+-------+-------------+
| A     | 10    | 2015-01-01  |
| B     | 20    | 2016-02-02  |
+-------+-------+-------------+

5.stack(int r,T1 V1,…,Tn/r Vn)

返回值:T1,…,Tn/r
功能:将n个值V1,…,Vn 转换为r行,每行有n/r个字段。r必须是一个常数
示例:

> select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') as (col0,col1,col2);
+-------+-------+-------------+
| col0  | col1  |    col2     |
+-------+-------+-------------+
| A     | 10    | 2015-01-01  |
| B     | 20    | 2016-01-01  |
+-------+-------+-------------+

6.json_tuple(string jsonStr,string k1,…,string kn)

返回值:string1,…,stringn
功能:接受一个json字符串和n个key,并返回n个值的tuple。这比get_json_object UDF更高效,因为一个调用就可以获得多个key的值
示例:

> select json_tuple('{"name":"LiMing","sex":"male","age":"38"}','name','age') as (name,age);
+---------+------+
|  name   | age  |
+---------+------+
| LiMing  | 38   |
+---------+------+

7.parse_url_tuple(string urlStr,string p1,…,string pn)

返回值:string1,…,stringn
功能:接收一个URL字符串和n个URL部分,并返回n个值的tuple。类似于parse_url() UDF,但可以从一个URL 中一次提取多个部分。有效的部分名称是:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:
示例:

> SELECT parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST','PATH', 'REF')  as (host,path,ref); 
+---------------+---------------+-------+
|     host      |     path      |  ref  |
+---------------+---------------+-------+
| facebook.com  | /path1/p.php  | Ref1  |
+---------------+---------------+-------+

参考

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF)
https://www.cnblogs.com/MOBIN/p/5618747.html#8

发布了57 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CPP_MAYIBO/article/details/104066064