LATERAL VIEW
The LATERAL VIEW clause is used in conjunction with generator functions (such as EXPLODE, POSEXPLODE, etc.) to expand array or MAP type columns into multiple rows, generating a virtual table that is joined with the original table.
Syntax
SELECT ...
FROM table_reference
LATERAL VIEW [OUTER] generator_function [table_alias] AS column_alias [, ...]
[LATERAL VIEW ...]
Parameter Description
OUTER: Optional. When the input array or MAP is empty or NULL, the original row is preserved and the expanded columns are filled with NULL (similar to LEFT JOIN semantics). Without OUTER, empty array/NULL rows are filtered out.
generator_function: The generator function, commonly EXPLODE (expands arrays or MAPs) and POSEXPLODE (expands arrays with position index).
table_alias: Optional. Specifies an alias for the virtual table.
column_alias: Specifies column aliases for the output of the generator function. The number of aliases must match the number of output columns of the generator function.
Examples
Prepare Test Data
CREATE TABLE emp_skills (
id INT,
name STRING,
skills ARRAY<STRING>
);
INSERT INTO emp_skills (id, name, skills) VALUES
(1, 'John Doe', ARRAY('Java', 'Python', 'SQL')),
(2, 'Jane Smith', ARRAY('C++', 'Hadoop', 'SQL')),
(3, 'Bob Johnson', ARRAY('Python', 'Docker')),
(4, 'Alice Wang', NULL);
Example 1: EXPLODE -- Expand an Array into Multiple Rows
Split each employee's skills array into individual rows.
SELECT e.id, e.name, s.skill
FROM emp_skills e
LATERAL VIEW EXPLODE(e.skills) s AS skill
ORDER BY e.id, s.skill;
Result:
+----+-------------+--------+
| id | name | skill |
+----+-------------+--------+
| 1 | John Doe | Java |
| 1 | John Doe | Python |
| 1 | John Doe | SQL |
| 2 | Jane Smith | C++ |
| 2 | Jane Smith | Hadoop |
| 2 | Jane Smith | SQL |
| 3 | Bob Johnson | Docker |
| 3 | Bob Johnson | Python |
+----+-------------+--------+
Note: The row with id=4 (Alice Wang, skills is NULL) is filtered out.
Example 2: LATERAL VIEW OUTER -- Preserve Empty Array/NULL Rows
SELECT e.id, e.name, s.skill
FROM emp_skills e
LATERAL VIEW OUTER EXPLODE(e.skills) s AS skill
ORDER BY e.id, s.skill;
Result:
+----+-------------+--------+
| id | name | skill |
+----+-------------+--------+
| 1 | John Doe | Java |
| 1 | John Doe | Python |
| 1 | John Doe | SQL |
| 2 | Jane Smith | C++ |
| 2 | Jane Smith | Hadoop |
| 2 | Jane Smith | SQL |
| 3 | Bob Johnson | Docker |
| 3 | Bob Johnson | Python |
| 4 | Alice Wang | NULL |
+----+-------------+--------+
With OUTER, the id=4 row is preserved, with the skill column set to NULL.
Example 3: POSEXPLODE -- Expand Array with Position Index
POSEXPLODE expands the array and returns the position index (starting from 0) of each element.
SELECT e.id, e.name, ps.pos, ps.skill
FROM emp_skills e
LATERAL VIEW POSEXPLODE(e.skills) ps AS pos, skill
ORDER BY e.id, ps.pos;
Result:
+----+-------------+-----+--------+
| id | name | pos | skill |
+----+-------------+-----+--------+
| 1 | John Doe | 0 | Java |
| 1 | John Doe | 1 | Python |
| 1 | John Doe | 2 | SQL |
| 2 | Jane Smith | 0 | C++ |
| 2 | Jane Smith | 1 | Hadoop |
| 2 | Jane Smith | 2 | SQL |
| 3 | Bob Johnson | 0 | Python |
| 3 | Bob Johnson | 1 | Docker |
+----+-------------+-----+--------+
Example 4: Multiple LATERAL VIEW -- Expand Multiple Array Columns
You can chain multiple LATERAL VIEW clauses in a single query to expand different array columns.
-- Assume the table has both skills and languages as array columns
SELECT e.id, e.name, s.skill, l.lang
FROM emp_skills e
LATERAL VIEW EXPLODE(e.skills) s AS skill
LATERAL VIEW EXPLODE(ARRAY('Chinese', 'English')) l AS lang
ORDER BY e.id, s.skill, l.lang
LIMIT 6;
Example 5: Expand MAP Type
EXPLODE also supports MAP types, generating two columns: key and value.
-- Assume the scores column is of type MAP<STRING, INT>
SELECT id, name, kv.subject, kv.score
FROM student_scores
LATERAL VIEW EXPLODE(scores) kv AS subject, score
ORDER BY id, subject;
Notes
LATERAL VIEW must immediately follow the table reference in the FROM clause and cannot be placed after WHERE.
- Without
OUTER, rows with empty arrays (ARRAY()) or NULL are filtered out, behaving like an INNER JOIN.
POSEXPLODE outputs two columns (position index and value), so two column aliases must be provided after AS.
- Multiple
LATERAL VIEW clauses produce a Cartesian product relationship, meaning the number of result rows multiplies when expanding multiple arrays. Use with caution regarding data volume.