No MaxCompute, use a cláusula LATERAL VIEW com uma função de tabela definida pelo usuário (UDTF) para dividir uma única linha de dados em várias linhas. Este tópico descreve como usar o LATERAL VIEW.
Introdução
O LATERAL VIEW processa principalmente tipos de dados complexos no MaxCompute, como Array e Map. Uma instrução SELECT padrão retorna uma linha de saída para cada linha de entrada. No entanto, uma UDTF overview estabelece uma relação de um para muitos entre entrada e saída. Por isso, não use uma UDTF diretamente na lista SELECT. Para contornar essa limitação, utilize o LATERAL VIEW com uma UDTF para dividir uma única linha de dados em múltiplas linhas e agregar os dados resultantes.
Se a instrução LATERAL VIEW incluir a palavra-chave OUTER, como em LATERAL VIEW OUTER ..., e a UDTF não retornar nenhuma linha, o conjunto de resultados manterá a linha de entrada original. Todas as colunas que a UDTF geraria receberão o valor NULL.
Sintaxe
LATERALVIEW: LATERAL VIEW [OUTER] <udtf_name>(<expression>) <table_alias> AS <columnAlias> (',' <columnAlias>)
fromClause: FROM <baseTable> (LATERALVIEW) [(LATERALVIEW) ...]
Parâmetros
udtf_name: Obrigatório. A UDTF que divide uma única linha de dados em várias linhas. Para mais informações, consulte Overview of other functions.
expression: Obrigatório. O nome da coluna que contém os dados a serem divididos.
table_alias: Obrigatório. O alias do conjunto de resultados da UDTF.
columnAlias: Obrigatório. O alias das colunas geradas pela divisão de linhas.
baseTable: Obrigatório. A tabela de source.
Use várias instruções LATERAL VIEW após a cláusula FROM. Uma instrução LATERAL VIEW subsequente pode referenciar todas as tabelas e nomes de colunas anteriores, o que permite dividir dados de diferentes colunas.
Dados de exemplo
A tabela pageAds contém três colunas: pageid STRING, col1 ARRAY<INT> e col2 ARRAY<STRING>. Os dados são os seguintes:
|
pageid |
col1 |
col2 |
|
front_page |
[1, 2, 3] |
["a", "b", "c"] |
|
contact_page |
[3, 4, 5] |
["d", "e", "f"] |
As instruções a seguir crie e preenchem a tabela:
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"));
Exemplos
-
Instrução LATERAL VIEW única
-
Exemplo 1: Divida a coluna col1. Execute o seguinte comando:
SELECT pageid, col1_new, col2 FROM pageAds LATERAL VIEW EXPLODE(col1) adTable AS col1_new;Resultado retornado:
+--------------+------------+---------------+ | 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"] | +--------------+------------+---------------+ -
Exemplo 2: Divida a coluna col1 e execute uma operação de agregação. Use o seguinte comando:
SELECT col1_new, COUNT(1) AS COUNT FROM pageAds LATERAL VIEW EXPLODE(col1) adTable AS col1_new GROUP BY col1_new;Resultado retornado:
+------------+------------+ | col1_new | count | +------------+------------+ | 1 | 1 | | 2 | 1 | | 3 | 2 | | 4 | 1 | | 5 | 1 | +------------+------------+
-
-
Múltiplas instruções LATERAL VIEW****
Divida as colunas col1 e col2. Execute o seguinte comando:
SELECT pageid,mycol1, mycol2 FROM pageAds LATERAL VIEW EXPLODE(col1) myTable1 AS mycol1 LATERAL VIEW EXPLODE(col2) myTable2 AS mycol2;Resultado retornado:
+--------------+------------+------------+ | 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 | +--------------+------------+------------+
Referências
Para transpor dados entre linhas e colunas, utilize a instrução LATERAL VIEW. Para mais informações, consulte Best practices for transposing rows and columns.