En MaxCompute, puede usar una cláusula LATERAL VIEW con una función de tabla definida por el usuario (UDTF) para dividir una sola fila de datos en varias filas. Este tema describe cómo usar LATERAL VIEW.
Introducción
LATERAL VIEW se usa principalmente en MaxCompute para procesar tipos de datos complejos, como Array y Map. Una instrucción SELECT estándar devuelve una fila de salida por cada fila de entrada. Sin embargo, una descripción general de UDTF tiene una relación de uno a varios entre su entrada y su salida. Por esta razón, no es posible usar una UDTF directamente en la lista SELECT. Para superar esta limitación, use LATERAL VIEW con una UDTF; esto le permite dividir una fila de datos en varias filas y luego agregar los datos resultantes.
Si la instrucción LATERAL VIEW incluye la palabra clave OUTER, como en LATERAL VIEW OUTER ..., y la UDTF no devuelve ninguna fila, la fila de entrada original se conserva en el conjunto de resultados. Todas las columnas que generaría la UDTF se establecen en NULL.
Sintaxis
LATERALVIEW: LATERAL VIEW [OUTER] <udtf_name>(<expression>) <table_alias> AS <columnAlias> (',' <columnAlias>)
fromClause: FROM <baseTable> (LATERALVIEW) [(LATERALVIEW) ...]
Parámetros
udtf_name: Obligatorio. La UDTF que se usa para dividir una sola fila de datos en varias filas. Para obtener más información, consulte Descripción general de otras funciones.
expression: Obligatorio. El nombre de la columna que contiene los datos por dividir.
table_alias: Obligatorio. El alias del conjunto de resultados de la UDTF.
columnAlias: Obligatorio. El alias de las columnas generadas por la división de filas.
baseTable: Obligatorio. La tabla de origen.
Puede usar varias instrucciones LATERAL VIEW después de la cláusula FROM. Una instrucción LATERAL VIEW posterior puede hacer referencia a todas las tablas y nombres de columna que la preceden. Esto le permite dividir datos de diferentes columnas.
Datos de ejemplo
La tabla pageAds contiene tres columnas: pageid STRING, col1 ARRAY<INT> y col2 ARRAY<STRING>. Los datos son a continuación:
|
pageid |
col1 |
col2 |
|
front_page |
[1, 2, 3] |
["a", "b", "c"] |
|
contact_page |
[3, 4, 5] |
["d", "e", "f"] |
A continuación, las instrucciones crean y llenan la tabla:
CREATE TABLE pageAds (pageid STRING,col1 ARRAY<INT>,col2 ARRAY<STRING>);
INSERT INTO pageAds VALUES ('front_page',ARRAY(1,2,3),ARRAY("a","b","c"));
INSERT INTO pageAds VALUES ('contact_page',ARRAY(3,4,5),ARRAY("d","e","f"));
Ejemplos
-
Instrucción única de LATERAL VIEW****
-
Ejemplo 1: Divida la columna col1. El comando es a continuación:
SELECT pageid, col1_new, col2 FROM pageAds LATERAL VIEW EXPLODE(col1) adTable AS col1_new;El resultado devuelto es a continuación:
+--------------+------------+---------------+ | pageid | col1_new | col2 | +--------------+------------+---------------+ | front_page | 1 | ["a","b","c"] | | front_page | 2 | ["a","b","c"] | | front_page | 3 | ["a","b","c"] | | contact_page | 3 | ["d","e","f"] | | contact_page | 4 | ["d","e","f"] | | contact_page | 5 | ["d","e","f"] | +--------------+------------+---------------+ -
Ejemplo 2: Divida la columna col1 y ejecute una operación de agregación. El comando es a continuación:
SELECT col1_new, COUNT(1) AS COUNT FROM pageAds LATERAL VIEW EXPLODE(col1) adTable AS col1_new GROUP BY col1_new;El resultado devuelto es a continuación:
+------------+------------+ | col1_new | count | +------------+------------+ | 1 | 1 | | 2 | 1 | | 3 | 2 | | 4 | 1 | | 5 | 1 | +------------+------------+
-
-
Varias instrucciones de LATERAL VIEW****
Divida las columnas col1 y col2. El comando es a continuación:
SELECT pageid,mycol1, mycol2 FROM pageAds LATERAL VIEW EXPLODE(col1) myTable1 AS mycol1 LATERAL VIEW EXPLODE(col2) myTable2 AS mycol2;El resultado devuelto es a continuación:
+--------------+------------+------------+ | 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 | +--------------+------------+------------+
Referencias
Para transponer datos entre filas y columnas, use la instrucción LATERAL VIEW. Para obtener más información, consulte Best practices for transposing rows and columns.