O MaxCompute oferece suporte a consultas schemaless em tabelas externas Parquet no OSS. É possível exportar o dataset analisado para o OSS, gravá-lo em uma tabela interna ou incorporá-lo como subconsulta em operações SQL para um processamento flexível do data lake.
Informações gerais
A exploração ad hoc de dados estruturados com Spark não exige um modelo fixo de data warehouse. No entanto, definir schemas de tabela e mapear manualmente os campos de arquivos antes de ler ou gravar no OSS torna o gerenciamento de partições trabalhoso e inflexível.
Com a instrução LOAD, o MaxCompute analisa automaticamente os arquivos Parquet e lê os dados como um dataset com schema. Selecione colunas específicas diretamente desse dataset para processamento semelhante a operações em tabelas. Use o comando UNLOAD para exportar resultados para o OSS, ou utilize CREATE TABLE AS para importá-los em uma tabela interna. O dataset também pode servir como subconsulta em outras instruções SQL para operações flexíveis sobre dados do data lake.
Aplicabilidade
O Schemaless Query não oferece suporte ao tratamento de subdiretórios em um bucket OSS como partições.
Para dados no formato JSON, apenas JSONL é compatível.
Sintaxe
SELECT *, <col_name>, <table_alias>.<col_name>
FROM
LOCATION '<location_path>'
('key'='value' [, 'key1'='value1', ...])
[AS <table_alias>];
Descrição dos parâmetros
Parâmetro | Obrigatório | Descrição |
* | Sim | Consulta todos os campos do arquivo. |
col_name | Sim | Consulta um campo pelo nome da coluna no arquivo. O tipo DECIMAL aceita apenas |
table_alias.col_name | Sim | Consulta um campo pelo nome da coluna usando o caminho totalmente qualificado do alias de tabela e do nome da coluna. |
table_alias | Não | Alias personalizado para a tabela. |
location_path | Sim |
|
key&value | Sim | Parâmetros e seus valores para a instrução de consulta. Consulte a tabela a seguir para mais detalhes. |
Tabela de parâmetros chave-valor
Chave | Obrigatório | Descrição | Valor | Padrão |
file_format | Sim | O formato do arquivo no location. Apenas Parquet e JSON são compatíveis. Outros formatos retornam um erro. | parquet、json | parquet |
rolearn | Não | O RoleARN necessário para acessar o location.
Nota Se nenhum RoleARN for especificado na instrução SQL, o sistema utiliza o ARN da função |
| acs:ram::1234****:role/aliyunodpsdefaultrole |
file_pattern_blacklist | Não | Lista de bloqueios de arquivos a excluir. Arquivos cujos nomes correspondem ao padrão não são lidos. |
| Nenhum |
file_pattern_whitelist | Não | Lista de permissões de arquivos a incluir. Apenas arquivos cujos nomes correspondem ao padrão são lidos. |
|
|
Exemplos
Exemplo 1: Leitura de dados OSS com os parâmetros de lista de permissões e lista de bloqueios
-
Prepare os dados.
Acesse o OSS console.
No painel de navegação à esquerda, clique em Buckets.
Na página Buckets, clique em Create Bucket.
Crie o diretório do bucket OSS
object-table-test/schema/.-
Prepare um arquivo Parquet para leitura e validação da lista de permissões. Execute o seguinte código Python localmente para criar o arquivo.
import pandas as pd # Sample data data = [ {'id': 3, 'name': 'Charlie', 'age': 35}, {'id': 4, 'name': 'David', 'age': 40}, {'id': 5, 'name': 'Eve', 'age': 28} ] df = pd.DataFrame(data) df['id'] = df['id'].astype('int32') df['name'] = df['name'].astype('str') df['age'] = df['age'].astype('int32') output_filename = 'sample_data.parquet' df.to_parquet(output_filename, index=False, engine='pyarrow') -
Faça upload do arquivo Parquet para o diretório do bucket OSS
object-table-test/schema/.Acesse o OSS console.
No diretório do bucket
object-table-test/schema/, clique em Upload File.
Prepare um arquivo CSV no diretório do bucket OSS
object-table-test/schema/para validar o parâmetro de lista de bloqueios.
-
Leia o arquivo Parquet.
Conecte-se ao MaxCompute client (odpscmd) e execute os seguintes comandos SQL.
-
Adicione
test_oss.csvà lista de bloqueios e leia o arquivo Parquet do OSS.SELECT id, name, age FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'file_pattern_blacklist'='.*test_oss.*' ); -
Adicione
sample_dataà lista de permissões e leia o arquivo Parquet do OSS.SELECT id, name, age FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'file_pattern_whitelist'='.*sample_data.*' );
Em ambos os casos, o arquivo
sample_dataé lido. O resultado retornado é:+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+ -
Exemplo 2: Leitura de dados gravados pelo Spark
Crie o diretório do bucket OSS
object-table-test/spark/.-
Gere dados Parquet usando o Serverless Spark. Para mais informações, consulte Create an SQL job. Pule esta etapa se já existirem arquivos Parquet gravados pelo Spark no diretório OSS.
Acesse o E-MapReduce console e selecione uma região no canto superior esquerdo.
No painel de navegação à esquerda, escolha .
Na página Spark, clique no nome do workspace desejado para abri-lo. Como alternativa, clique em Create Workspace. Após criar o novo workspace, clique no nome dele para abri-lo.
-
No painel de navegação à esquerda, escolha Data Development e crie um arquivo Spark SQL para executar as seguintes instruções SQL:
CREATE TABLE example_table_parquet04 ( id STRING, name STRING, age STRING, salary DOUBLE, is_active BOOLEAN, created_at TIMESTAMP, details STRUCT<department:STRING, position:STRING> ) USING PARQUET; INSERT INTO example_table_parquet04 VALUES ('1', 'Alice', '30', 5000.50, TRUE, TIMESTAMP '2024-01-01 10:00:00', STRUCT('HR', 'Manager')), ('2', 'Bob', '25', 6000.75, FALSE, TIMESTAMP '2024-02-01 11:00:00', STRUCT('Engineering', 'Developer')), ('3', 'Charlie','35', 7000.00, TRUE, TIMESTAMP '2024-03-01 12:00:00', STRUCT('Marketing', 'Analyst')), ('4', 'David', '40', 8000.25, FALSE, TIMESTAMP '2024-04-01 13:00:00', STRUCT('Sales', 'Representative')), ('5', 'Eve', '28', 5500.50, TRUE, TIMESTAMP '2024-05-01 14:00:00', STRUCT('Support', 'Technician')); SELECT * FROM example_table_parquet04;
Acesse o OSS console e visualize os arquivos de dados gerados no caminho de destino.
-
Conecte-se ao cliente MaxCompute, adicione
_SUCCESSà lista de bloqueios e leia o arquivo Parquet do OSS.SELECT * FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/spark/example_table_parquet04/' ( 'file_format'='parquet', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'file_pattern_blacklist'='.*_SUCCESS.*' );O resultado retornado é:
+----+---------+-----+------------+-----------+---------------------+----------------------------------------------+ | id | name | age | salary | is_active | created_at | details | +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+ | 1 | Alice | 30 | 5000.5 | true | 2024-01-01 10:00:00 | {department:HR, position:Manager} | | 2 | Bob | 25 | 6000.75 | false | 2024-02-01 11:00:00 | {department:Engineering, position:Developer} | | 3 | Charlie | 35 | 7000.0 | true | 2024-03-01 12:00:00 | {department:Marketing, position:Analyst} | | 4 | David | 40 | 8000.25 | false | 2024-04-01 13:00:00 | {department:Sales, position:Representative} | | 5 | Eve | 28 | 5500.5 | true | 2024-05-01 14:00:00 | {department:Support, position:Technician} | +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
Para mais informações sobre as operações do Schemaless Query, consulte Read Parquet data from a data lake using Schemaless Query.
Exemplo 3: Uso do Schemaless Query em uma subconsulta
-
Prepare os dados.
Acesse o OSS console e faça upload do arquivo de teste part-00001.snappy.parquet para o diretório do bucket OSS
object-table-test/schema/. Para mais informações, consulte Upload OSS files. -
Conecte-se ao cliente MaxCompute e crie uma tabela interna para armazenar os dados descobertos automaticamente no OSS.
CREATE TABLE ow_test ( id INT, name STRING, age INT ); -
Use o Schemaless Query para ler dados do OSS.
SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet' );O resultado retornado é:
+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+ -
Use os dados do OSS como subconsulta em uma instrução SQL externa para inserir dados na tabela ow_test.
INSERT OVERWRITE TABLE ow_test SELECT id,name,age FROM ( SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet' ) ); SELECT * FROM ow_test;O resultado retornado é:
+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+
Exemplo 4: Salvando resultados do Schemaless Query em uma tabela interna do data warehouse
-
Prepare os dados.
Acesse o OSS console e faça upload do arquivo de teste part-00001.snappy.parquet para o diretório do bucket OSS
object-table-test/schema/. Para mais informações, consulte Upload OSS files. -
Conecte-se ao cliente MaxCompute e use o Schemaless Query para ler dados do OSS.
SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet' );O resultado retornado é:
+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+ -
Use a instrução
CREATE TABLE ASpara copiar os dados descobertos automaticamente no OSS para uma tabela interna e, em seguida, consulte a tabela para visualizar o resultado.CREATE TABLE ow_test_2 AS SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet' ); -- Query the result table ow_test_2 SELECT * FROM ow_test_2;O resultado retornado é:
+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+
Exemplo 5: Exportação dos resultados do Schemaless Query de volta ao data lake com UNLOAD
-
Prepare os dados.
Acesse o OSS console e faça upload do arquivo de teste part-00001.snappy.parquet para o diretório do bucket OSS
object-table-test/schema/. Para mais informações, consulte Upload OSS files. -
Conecte-se ao cliente MaxCompute e use o Schemaless Query para ler dados do OSS.
SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet' );O resultado retornado é:
+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+ -
Use o comando UNLOAD para exportar os resultados descobertos automaticamente para o OSS. Para mais informações, consulte UNLOAD.
UNLOAD FROM ( SELECT * FROM LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ('file_format'='parquet') ) INTO LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/unload/ow_test_3/' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ('odps.external.data.enable.extension'='true') STORED AS PARQUET;Visualize o arquivo gerado no diretório OSS: após a execução bem-sucedida do comando, o arquivo Parquet
20250715070650775g0etr15glr2_M1_1_0_0-0_TableSink1.parqueté gerado no caminho OSSunload/ow_test_3/. O tamanho do arquivo é 0,449 KB e a classe de armazenamento é Standard.
Exemplo 6: Leitura de dados no formato JSON
Apenas arquivos JSONL são compatíveis.
Faça upload dos dados de teste JSONL para o OSS. sample_data.jsonl
-
Leia o arquivo sample_data.jsonl usando um Schemaless Query.
SELECT * FROM location 'oss://oss-<region>-internal.aliyuncs.com/<path>' ( 'file_format'='json', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' );