本文为您介绍Java UDTF和Python UDTF的使用方式和使用限制。
使用方式
UDTF在SQL中的使用方式如下。
select user_udtf(col0, col1, col2) as (c0, c1) from my_table;
select user_udtf(col0, col1, col2) as (c0, c1) from (select * from my_table distribute by key sort by key) t;
select reduce_udtf(col0, col1, col2) as (c0, c1) from (select col0, col1, col2 from (select map_udtf(a0, a1, a2, a3) as (col0, col1, col2) from my_table) t1 distribute by col0 sort by col0, col1) t2;
UDTF的详细使用说明请参见Java UDTF和Python UDTF。
使用限制
UDTF的使用限制如下:
- 同一个
select
子句中不允许有其他表达式。select value, user_udtf(key) as mycol ...
- UDTF不能嵌套使用。
select user_udtf1(user_udtf2(key)) as mycol...
- 不支持在同一个
select
子句中与group by
、distribute by
、sort by
联用。select user_udtf(key) as mycol ... group by mycol;
使用示例
为便于理解,为您提供通过MaxCompute内置UDTF函数与Lateral View结合,将单行数组型数据拆分为多行数据的示例。
假设已有一张表pageAds,它有三列数据,第一列是pageid string,第二列是col1 array<int>,第三列是col2 array<string>,详细数据如下。
pageid | col1 | col2 |
---|---|---|
front_page | [1, 2, 3] | [“a”, “b”, “c”] |
contact_page | [3, 4, 5] | [“d”, “e”, “f”] |
将col1和col2两列数据全部拆分,按行展示每一条数据。命令示例如下:
select pageid,mycol1, mycol2 from pageAds
lateral view explode(col1) myTable1 as mycol1
lateral view explode(col2) myTable2 as mycol2;
返回结果如下:+------------+------------+------------+
| pageid | mycol1 | mycol2 |
+------------+------------+------------+
| front_page | 1 | a |
| front_page | 1 | b |
| front_page | 1 | c |
| front_page | 2 | a |
| front_page | 2 | b |
| front_page | 2 | c |
| front_page | 3 | a |
| front_page | 3 | b |
| front_page | 3 | c |
| contact_page | 3 | d |
| contact_page | 3 | e |
| contact_page | 3 | f |
| contact_page | 4 | d |
| contact_page | 4 | e |
| contact_page | 4 | f |
| contact_page | 5 | d |
| contact_page | 5 | e |
| contact_page | 5 | f |
+------------+------------+------------+