Este tópico usa um cluster E-MapReduce Serverless Spark como exemplo para demonstrar o uso do Schemaless Query no MaxCompute. O processo ilustra a leitura de arquivos Parquet gerados pelo Spark SQL e a exportação dos resultados para o Object Storage Service (OSS) com o comando UNLOAD.
Pré-requisitos
-
Você tem um workspace do EMR Serverless Spark.
Este tópico usa a região China (Hangzhou) como exemplo. Considere que o workspace se chama
schemaless_teste o bucket do OSS se chamaoss-mc-test. Você tem um projeto do MaxCompute.
Etapa 1: Gerar dados Parquet com o Serverless Spark
Faça login no console do E-MapReduce. No painel de navegação à esquerda, escolha .
Na página Spark, clique no nome do seu workspace. Na página EMR Serverless Spark, clique em Data Development no painel de navegação à esquerda.
-
Crie um job Spark SQL, insira os comandos SQL a seguir para criar uma tabela Parquet e preenchê-la com dados e clique em Execute.
ImportanteAntes de executar os comandos abaixo, verifique se o diretório de dados e o banco de dados selecionados no canto superior direito da página estão associados ao caminho do seu bucket do OSS.
CREATE TABLE example_table01 ( id INT, name STRING, age INT ) USING PARQUET; INSERT INTO example_table01 VALUES (1, 'Alice', 30), (2, 'Bob', 25), (3, 'Charlie', 35), (4, 'David', 40), (5, 'Eve', 32), (6, 'Frank', 28), (7, 'Grace', 33), (8, 'Hannah', 29), (9, 'Ian', 36), (10, 'Julia', 31); SELECT * FROM example_table01; -
Após a execução bem-sucedida, visualize a tabela
example_table01gerada na página Metadata do console do Data Lake Formation. Selecione a aba Tables para visualizar a tabela example_table01 criada. A tabela está no formato Parquet.Também é possível verificar os arquivos Parquet no seu bucket do OSS. O diretório
example_table01/contém um arquivo marcador_SUCCESSe dois arquivos de dados.snappy.parquet. Isso indica que os dados Parquet foram gravados com sucesso.
Etapa 2: Ler dados com o Schemaless Query
Para saber mais sobre a leitura de arquivos Parquet no MaxCompute, consulte Schemaless Query.
Quando o Spark grava dados em uma tabela Parquet, ele gera um arquivo marcador chamado _SUCCESS. Use o parâmetro file_pattern_blacklist para adicionar o arquivo _SUCCESS à lista de bloqueios. Essa configuração impede que o MaxCompute tente lê-lo como um arquivo de dados, o que causaria um erro.
SELECT * FROM
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/example_table01/'
(
'file_format'='parquet',
'file_pattern_blacklist'='.*_SUCCESS.*'
);
Resultado retornado:
+------------+------------+------------+
| id | name | age |
+------------+------------+------------+
| 1 | Alice | 30 |
| 2 | Bob | 25 |
| 3 | Charlie | 35 |
| 4 | David | 40 |
| 5 | Eve | 32 |
| 6 | Frank | 28 |
| 7 | Grace | 33 |
| 8 | Hannah | 29 |
| 9 | Ian | 36 |
| 10 | Julia | 31 |
+------------+------------+------------+
Etapa 3: Calcular com SQL
Consulte a quantidade de pessoas com mais de 30 anos.
SELECT COUNT(*) FROM
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/example_table01/'
(
'file_format'='parquet',
'file_pattern_blacklist'='.*_SUCCESS.*'
)
WHERE age>30;
Resultado retornado:
+------------+
| _c0 |
+------------+
| 6 |
+------------+
Etapa 4: Exportar o resultado para o OSS
O MaxCompute permite exportar dados para armazenamentos externos, como o OSS, e disponibilizá-los para outros mecanismos de computação. Para mais detalhes, consulte UNLOAD.
-
Execute o comando a seguir no MaxCompute para exportar o resultado do cálculo da Etapa 3 para o OSS no formato Parquet.
Antes de executar o código abaixo, crie o diretório
unload_schemalessno bucket do OSSoss-mc-test.UNLOAD FROM ( SELECT COUNT(*) FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/example_table01/' ('file_format'='parquet','file_pattern_blacklist'='.*_SUCCESS.*') WHERE age>30 ) INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/unload_schemaless/' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/AliyunODPSDefaultRole') STORED AS PARQUET PROPERTIES('mcfed.parquet.compression'='SNAPPY') ; Acesse o console do OSS para verificar se a operação UNLOAD foi concluída com sucesso.