列转行 (Lateral View)
更新时间:2025-08-21
与生成器函数(例如 EXPLODE)结合使用,LATERAL VIEW 可以生成一个包含一个或多个行的虚拟表,并将这些行应用于每个原始输出行。
语法
SQL
1LATERAL VIEW generator_function ( expression [, ...] ) table_identifier AS column_identifier [, ...]
参数
generator_function:生成器函数(如 EXPLODE、EXPLODE_SPLIT 等)。table_identifier:generator_function的别名。column_identifier:列别名,用于输出行。列标识符的数量必须与生成器函数返回的列数匹配。
示例
假设有一个名为 person 的表,结构如下:
SQL
1CREATE TABLE `person` (
2 `id` int(11) NULL,
3 `name` text NULL,
4 `age` int(11) NULL,
5 `class` int(11) NULL,
6 `address` text NULL
7) ENGINE=OLAP
8UNIQUE KEY(`id`)
9COMMENT 'OLAP'
10DISTRIBUTED BY HASH(`id`) BUCKETS 1
11PROPERTIES (
12"replication_allocation" = "tag.location.default: 1",
13"in_memory" = "false",
14"storage_format" = "V2",
15"disable_auto_compaction" = "false"
16);
17
18INSERT INTO person VALUES
19 (100, 'John', 30, 1, 'Street 1'),
20 (200, 'Mary', NULL, 1, 'Street 2'),
21 (300, 'Mike', 80, 3, 'Street 3'),
22 (400, 'Dan', 50, 4, 'Street 4');
使用 LATERAL VIEW 和 EXPLODE 函数查询 person 表:
SQL
1SELECT * FROM person
2LATERAL VIEW EXPLODE(ARRAY(30, 60)) tableName AS c_age;
查询结果将包含原始行的每个组合,以及 EXPLODE 函数生成的行:
SQL
1+------+------+------+-------+----------+-------+
2| id | name | age | class | address | c_age |
3+------+------+------+-------+----------+-------+
4| 100 | John | 30 | 1 | Street 1 | 30 |
5| 100 | John | 30 | 1 | Street 1 | 60 |
6| 200 | Mary | NULL | 1 | Street 2 | 30 |
7| 200 | Mary | NULL | 1 | Street 2 | 60 |
8| 300 | Mike | 80 | 3 | Street 3 | 30 |
9| 300 | Mike | 80 | 3 | Street 3 | 60 |
10| 400 | Dan | 50 | 4 | Street 4 | 30 |
11| 400 | Dan | 50 | 4 | Street 4 | 60 |
12+------+------+------+-------+----------+-------+
138 rows in set (0.12 sec)
