一、概述
在hive中,udtf(user defined tableGenerating function)是指接收一行数据,输出一行或者多行数据的函数,也称制表函数,通常指的是炸裂函数。炸裂函数最常见的操作是lateral view结合explode函数进行使用。
二、常见的炸裂函数
(1)explode(array<T> a)
explode函数,可以将每个数组元素拆分成多行,每行包含一个元素。
如通过以下建表语句创建表并插入数据:
CREATE TABLE user_data (id INT, items ARRAY<STRING>);
INSERT INTO user_data VALUES
(1, ARRAY('apple', 'banana', 'cherry')),
(2, ARRAY('grape', 'orange'));使用
explode
函数可以将每个items
数组中的元素展开为单独的行:SELECT id, item FROM user_data LATERAL VIEW explode(items) exploded_table AS item; 输出结果如下所示:
id item 1
apple 1 banana 1 cherry 2 grape 2 orange
(2) posexplode(array<T> a)
posexplode函数与explode函数类似,也是对数组元素进行拆分返回多行,不过posexplode函数还会额外返回一列元素在数组中的pos位置信息。
如对上面的表数据应用posexplode:
SELECT id, pos, item FROM user_data
LATERAL VIEW posexplode(items) exploded_table AS pos, item;
输出结果如下:
id pos item 1 0 apple 1 1 banana 1 2 cherry 2 0 grape 2 1 orange
(3) inline(array<struct<f1,t1,...,fn,tn>>)
inline函数用于将结构体数组进行展开,结构体数组的每一个结构体是一行,一个结构体的每个字段都会展开成表的列。
如创建以下表,并插入数据:
CREATE TABLE user_data (id INT, items ARRAY<STRUCT<name: STRING, price: INT>>);
INSERT INTO user_data
VALUES (1, ARRAY(NAMED_STRUCT('name', 'apple', 'price', 5),NAMED_STRUCT('name', 'banana', 'price', 2))),
(2, ARRAY(NAMED_STRUCT('name', 'orange', 'price', 3), NAMED_STRUCT('name', 'grape', 'price', 4)));
用inline函数展开结构体数组:
SELECT id, name, price
FROM user_data
LATERAL VIEW inline(items) exploded_table AS name, price;
输出结果如下:
id name price 1 apple 5 1 banana 2 2 orange 3 2 grape 4
三、lateral view
lateral view成为侧视图,通常与炸裂函数配合使用,可以将炸裂函数应用到源表的每一行数据上,让每个被展开的元素与原始表的每一行数据连接在一起,将每行数据转换为一行或多行,形成一个虚拟表。