本文为您介绍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 UDTFPython UDTF

使用限制

UDTF的使用限制如下:
  • 同一个select子句中不允许有其他表达式。
    select value, user_udtf(key) as mycol ...
  • UDTF不能嵌套使用。
    select user_udtf1(user_udtf2(key)) as mycol...
  • 不支持在同一个select子句中与group bydistribute bysort 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          |
+------------+------------+------------+