Todos os produtos
Search
Central de documentação

MaxCompute:Feature: Schemaless Query

Última atualização: Sep 18, 2026

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 precision <=38 && scale<=18.

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

  • O caminho do arquivo. Deve ser um diretório OSS no formato oss://oss_endpoint/bucket_name/path/.

  • O próximo nível abaixo de path aceita diretórios de partição no formato partition_name=partition_value.

  • O Schemaless Query não trata subdiretórios do location como partições; portanto, a eliminação de partições não é compatível.

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.

  • Acesse o RAM console.

  • No painel de navegação à esquerda, selecione Identities > Roles.

  • Na seção Basic Information, obtenha o ARN.

Nota

Se nenhum RoleARN for especificado na instrução SQL, o sistema utiliza o ARN da função AliyunODPSDefaultRole.

acs:ram::xxxxxx:role/aliyunodpsdefaultrole

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.

"._SUCCESS$,.\\.hive_staging.*"

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.

"._20250124_..parquet"

.*

Exemplos

Exemplo 1: Leitura de dados OSS com os parâmetros de lista de permissões e lista de bloqueios

  1. Prepare os dados.

    1. Acesse o OSS console.

    2. No painel de navegação à esquerda, clique em Buckets.

    3. Na página Buckets, clique em Create Bucket.

    4. Crie o diretório do bucket OSS object-table-test/schema/.

    5. 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')
      
    6. Faça upload do arquivo Parquet para o diretório do bucket OSS object-table-test/schema/.

      1. Acesse o OSS console.

      2. No diretório do bucket object-table-test/schema/, clique em Upload File.

    7. Prepare um arquivo CSV no diretório do bucket OSS object-table-test/schema/ para validar o parâmetro de lista de bloqueios.

  2. 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

  1. Crie o diretório do bucket OSS object-table-test/spark/.

  2. 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.

    1. Acesse o E-MapReduce console e selecione uma região no canto superior esquerdo.

    2. No painel de navegação à esquerda, escolha EMR Serverless > Spark.

    3. 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.

    4. 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;
  3. Acesse o OSS console e visualize os arquivos de dados gerados no caminho de destino.

  4. 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

  1. 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.

  2. 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
    );
  3. 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         |
    +------------+------------+------------+
  4. 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

  1. 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.

  2. 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         |
    +------------+------------+------------+
  3. Use a instrução CREATE TABLE AS para 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

  1. 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.

  2. 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         |
    +------------+------------+------------+
  3. 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 OSS unload/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.

  1. Faça upload dos dados de teste JSONL para o OSS. sample_data.jsonl

  2. 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'
    );