FROM
功能描述
FROM子句用于指定查询的数据源。Spark 4.0增强了FROM子句,支持LATERAL子查询、TABLE关键字、VALUES行构造等多种数据源形式。
语法格式
FROM table_reference [, ...]
其中 table_reference 为:
{ table_name [ TABLE ] [ alias ]
| join_table
| LATERAL ( subquery ) [ alias ]
| ( subquery ) [ alias ]
| VALUES ( { expression } [, ...] ) [, ...] [ alias ]
} join_table 为:
table_reference [ join_type ] JOIN table_reference [ ON join_condition | USING ( column [, ...] ) ]
join_type 为:
{ INNER | CROSS | LEFT [ OUTER ] | RIGHT [ OUTER ] | FULL [ OUTER ] | LEFT SEMI | LEFT ANTI } 参数说明
| 参数 | 说明 |
|---|---|
| table_name | 表名,指定要查询的表。可使用TABLE关键字引用表值。 |
| alias | 为表或子查询指定别名。子查询必须指定别名。 |
| LATERAL (subquery) | LATERAL子查询,允许子查询引用同一FROM子句中先前出现的表的列。Spark 4.0增强支持。 |
| (subquery) | 嵌套子查询,子查询结果作为中间过渡表。子查询必须指定别名。 |
| VALUES | 行构造器,直接构造行数据作为数据源。 |
| join_type | 连接类型,包括INNER、CROSS、LEFT OUTER、RIGHT OUTER、FULL OUTER、LEFT SEMI、LEFT ANTI。 |
| ON join_condition | JOIN连接条件。 |
| USING (column) | 使用同名字段进行JOIN的简写方式。 |
注意事项
- 所要查询的表必须是已经存在的表,否则会出错。
- FROM嵌套子查询中,子查询必须指定别名。
- LATERAL子查询可以引用同一FROM子句中左侧表的列,普通子查询不能引用外部列。
示例
子查询作为数据源:
SELECT DISTINCT name FROM (SELECT name FROM student_info JOIN course_info ON student_info.courseId = course_info.courseId) temp;
LATERAL子查询引用外部列:
SELECT * FROM orders o, LATERAL (SELECT * FROM order_items WHERE order_id = o.id) items;
VALUES构造数据:
SELECT * FROM VALUES (1, 'a'), (2, 'b'), (3, 'c') AS t(id, name);
LATERAL VIEW与explode配合:
SELECT name, course FROM student LATERAL VIEW EXPLODE(courses) t AS course;