Todos os produtos
Search
Central de documentação

MaxCompute:Tabelas externas do Tablestore

Última atualização: Sep 24, 2026

Este tópico descreve como importar dados do Tablestore (Open Table Service, anteriormente OTS) para o MaxCompute, conectando múltiplas fontes de dados de forma integrada.

Visão geral

Tablestore é um service de armazenamento de dados NoSQL desenvolvido sobre o sistema distribuído Apsara da Alibaba Cloud. O Tablestore oferece armazenamento e acesso em tempo real a grandes volumes de dados estruturados. Para mais informações, consulte Tablestore documentation.

Você pode usar o DataWorks com o MaxCompute para crie, pesquisar, consultar, configure, processar e analisar tabelas externas de forma visual. Para mais informações, consulte External tables.

Notas de uso

  • Garanta a conectividade de rede entre o MaxCompute e o Tablestore. Ao acessar dados do Tablestore a partir do MaxCompute na cloud pública, recomendamos usar o endpoint privado do Tablestore. O endpoint privado termina com ots-internal.aliyuncs.com, por exemplo, tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com.

  • O Tablestore e o MaxCompute utilizam sistemas de tipos de dados distintos. A tabela a seguir apresenta os mapeamentos entre os tipos de dados suportados pelo Tablestore e pelo MaxCompute.

    MaxCompute Type

    Tablestore Type

    STRING

    STRING

    BIGINT

    INTEGER

    DOUBLE

    DOUBLE

    BOOLEAN

    BOOLEAN

    BINARY

    BINARY

  • As tabelas externas do Tablestore não suportam o atributo de clustering.

Pré-requisitos

Descrição de permissões

  • Ao acessar tabelas externas do Tablestore, os dados são acessados por meio da função especificada no parâmetro odps.properties.rolearn, independentemente de você estar usando uma conta Alibaba Cloud, um usuário RAM ou uma função RAM. Portanto, crie uma função RAM, conceda a ela permissões para acessar o Tablestore e, em seguida, configure o ARN da função no parâmetro odps.properties.rolearn.

  • Crie uma função por meio de autorização com um clique ou de autorização personalizada. Para mais informações, consulte Authorization for external data sources. Para uma descrição detalhada do parâmetro odps.properties.rolearn, consulte Parameter description.

Criar uma tabela externa

O MaxCompute oferece o recurso de tabela externa. Com as tabelas externas, você pode importar dados do Tablestore para o sistema de metadados do MaxCompute e processá-los. A seção a seguir descreve como criar uma tabela externa do Tablestore.

Veja a seguir um exemplo de instrução CREATE EXTERNAL TABLE.

DROP TABLE IF EXISTS ots_table_external;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
(
  odps_orderkey bigint,
  odps_orderdate string,
  odps_custkey bigint,
  odps_orderstatus string,
  odps_totalprice double,
  odps_createdate timestamp
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
WITH SERDEPROPERTIES (
  'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey,o_orderstatus,o_totalprice',
  'tablestore.table.name'='ots_tpch_orders',
  'odps.properties.rolearn'='acs:ram::xxxxx:role/<role_name>',
  'tablestore.read.mode'='permissive',
  'tablestore.corrupt.column'='ColumnName',
  'tablestore.timestamp.ticks.unit'='seconds',
  'tablestore.column.odps_createdate.timestamp.ticks.unit'='millis',
  'tablestore.table.put.row'='true'
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';

A tabela a seguir descreve os principais parâmetros da instrução de criação de tabela apresentada anteriormente.

Parameter

Required

Description

com.aliyun.odps.TableStoreStorageHandler

Yes

Handler de armazenamento nativo do MaxCompute usado para processar dados do Tablestore. Esse handler define a interação entre o MaxCompute e o Tablestore, sendo a lógica correspondente implementada pelo MaxCompute.

tablestore.columns.mapping

Yes

As colunas da tabela do Tablestore que o MaxCompute deve acessar, incluindo colunas de chave primária e colunas de atributo.

  • Dois-pontos (:) no início do nome de uma coluna indicam que ela é uma coluna de chave primária da tabela do Tablestore, como :o_orderkey e :o_orderdate no exemplo. As demais colunas são de atributo.

  • O Tablestore suporta de 1 a 4 colunas de chave primária. Os tipos de dados aceitos nas colunas de chave primária são STRING, INTEGER e BINARY. A primeira coluna de chave primária é a chave de partição.

  • Ao defina os mapeamentos de colunas, especifique todas as colunas de chave primária da tabela do Tablestore indicada, além das colunas de atributo que o MaxCompute deve acessar.

tablestore.table.name

Yes

O nome da tabela do Tablestore que o MaxCompute deve acessar. Neste exemplo, o nome é ots_tpch_orders.

odps.properties.rolearn

Yes

Especifique o ARN da função RAM com permissão para acessar o OSS. Você pode obtê-lo na página de detalhes da função no console do RAM.

  1. Faça login no RAM console.

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

  3. Na página Identities, clique em Roles desejado para acessar a página de detalhes da função.

  4. Na seção Roles, você pode obter o Role Name.

    Exemplo: acs:ram::xxxxx:role/aliyunodpsdefaultrole

tablestore.timestamp.ticks.unit

No

Configuração de tipo de tempo no nível da tabela. Esse parâmetro define que todos os campos do tipo de dados INTEGER na tabela externa utilizem a mesma unidade de tempo. Valores válidos:

  • Seconds

  • millis

  • micros (microssegundos)

  • nanos

tablestore.column.<col1_name>.timestamp.ticks.unit

No

Configuração de tipo de tempo no nível da coluna. Esse parâmetro define a unidade de tempo de uma coluna específica na tabela externa. Valores válidos:

  • seconds

  • millis (em milissegundos)

  • micros

  • nanos

Nota

Se tanto tablestore.timestamp.ticks.unit quanto tablestore.column.<col1_name>.timestamp.ticks.unit estiverem configurados, o parâmetro tablestore.column.<col1_name>.timestamp.ticks.unit tem precedência.

tablestore.table.put.row

No

Defina o modo de escrita da operação PutRow. Valores válidos:

  • True: ativado.

  • False (padrão): desativado.

Nota

Configure o parâmetro de flag a seguir para defina o modo de escrita da operação PutRow. O valor padrão é False. Para mais informações, consulte Flag parameter list.

SET odps.sql.unstructured.tablestore.put.row=true;

tablestore.read.mode

No

Defina o comportamento de leitura quando o MaxCompute detecta dados corrompidos na tabela externa do Tablestore. Valores válidos:

  • permissive (padrão): ao detectar dados corrompidos, o MaxCompute os ignora.

  • failfast: ao detectar dados corrompidos, o MaxCompute reporta um erro.

Para exemplos de processamento de dados corrompidos, consulte examples of dirty data processing.

tablestore.corrupt.column

No

Especifique a coluna na qual os dados corrompidos serão gravados.

  • Este parâmetro é exigido somente quando o parâmetro tablestore.read.mode está definido como permissive.

  • A coluna especificada deve ser a última coluna da tabela externa do MaxCompute.

  • Não é possível especifique uma coluna de chave primária do Tablestore.

Para exemplos de processamento de dados corrompidos, consulte examples of dirty data processing.

LOCATION

Yes

Especifique as informações do Tablestore, como o nome e o endpoint de uma instância do Tablestore. Conclua a autorização via RAM ou Security Token Service (STS) para garantir o acesso seguro aos dados do Tablestore.

Nota

Se um erro de incompatibilidade de tipos de rede for retornado ao usar o endpoint público, altere o tipo de rede para rede clássica.

Execute a instrução a seguir para visualize a estrutura da tabela externa criada:

DESC extended <table_name>;
Nota

No resultado da execução, Extended Info inclui as informações básicas da tabela externa, as informações sobre o handler de armazenamento e a localização da tabela externa.

Consultar dados na tabela externa

Após criar uma tabela externa, execute uma instrução SQL do MaxCompute para acessar os dados do Tablestore por meio dela. Exemplo:

SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
FROM ots_table_external
WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
GROUP BY odps_orderkey, odps_orderdate
HAVING sum_total> 400000.0;
Nota

Ao consultar tabelas externas ou campos, os nomes de tabelas e de campos não diferenciam maiúsculas de minúsculas, e conversões forçadas de maiúsculas e minúsculas não são suportadas.

Ao acessar dados do Tablestore via instruções SQL do MaxCompute, todas as operações — como a selecione de nomes de colunas — são realizadas no MaxCompute. No exemplo anterior, os nomes das colunas são odps_orderkey e odps_totalprice, e não os nomes da coluna de chave primária o_orderkey e da coluna de atributo o_totalprice da tabela do Tablestore. Isso ocorre porque os mapeamentos são definidos na instrução DDL usada para criar a tabela externa. Você também pode preservar os nomes das colunas de chave primária e de atributo da tabela do Tablestore, conforme necessário.

Para processar um mesmo conjunto de dados múltiplas vezes, importe os dados do Tablestore para uma tabela interna do MaxCompute. Assim, não será necessário ler os dados do Tablestore a cada execute de cálculo no MaxCompute. Exemplo:

CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
WHERE odps_orderkey > 5000 ;

internal_orders é uma tabela do MaxCompute que suporta todos os recursos de uma tabela interna do MaxCompute. A tabela internal_orders utiliza armazenamento colunar com compressão eficiente e contém dados macro internos completos e informações estatísticas. Por estar armazenada no MaxCompute, a tabela internal_orders é acessada com muito mais rapidez do que uma tabela do Tablestore. Esse método é indicado para dados que precisam ser processados múltiplas vezes.

Exportar dados do MaxCompute para o Tablestore

Nota

O MaxCompute não cria automaticamente uma tabela de destino no Tablestore. Antes de exportar dados para uma tabela do Tablestore, certifique-se de que a tabela já existe. Caso contrário, um erro será reportado.

Uma tabela externa chamada ots_table_external foi criada para permitir que o MaxCompute acesse a tabela ots_tpch_orders no Tablestore. Os dados estão armazenados em uma tabela interna do MaxCompute chamada internal_orders. Para processar os dados da tabela internal_orders e gravar o resultado de volta no Tablestore, execute a instrução insert overwrite table na tabela externa. Exemplo:

INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;
Nota

Se os dados da tabela interna do MaxCompute estiverem ordenados por chaves primárias, os dados serão gravados em uma única partição da tabela do Tablestore. Nesse caso, as operações de escrita distribuída não serão totalmente aproveitadas. Para esse cenário, recomendamos usar distribute by rand() para distribuir os dados de forma aleatória. Exemplo:

INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM (SELECT * FROM internal_orders DISTRIBUTE BY rand()) t;

O Tablestore é um service de armazenamento NoSQL que armazena dados no formato de par chave-valor. As saídas de dados do MaxCompute afetam apenas as linhas que contêm as chaves primárias da tabela do Tablestore. Neste exemplo, apenas as linhas que incluem odps_orderkey e odps_orderdate são afetadas. Somente as colunas de atributo especificadas na criação da tabela ots_table_external são atualizadas. As colunas não incluídas na tabela externa não são modificadas.

Nota
  • Se o volume de dados a ser gravado do MaxCompute para o Tablestore de uma só vez for superior a 4 MB, pode ocorrer um erro. Nesse caso, remova o excesso de dados e grave novamente no Tablestore.

    ODPS-0010000:System internal error - Output to TableStore failed with exception:
    TableStore BatchWrite request id XXXXX failed with error code OTSParameterInvalid and message:The total data size of BatchWriteRow request exceeds the limit
  • Gravar múltiplas entradas de dados simultaneamente ou por linha é considerado uma única operação. Para mais informações, consulte BatchWriteRow. Para gravar grandes volumes de dados de uma só vez, grave os dados por linha.

  • Ao gravar múltiplas entradas de dados de uma só vez, certifique-se de que não existam linhas duplicadas. A presença de linhas duplicadas pode ocasionar o seguinte erro:

    ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalid 

    Para mais informações, consulte OTSParameterInvalid error when you use BatchWriteRow to envie 100 data entries at a time.

  • Como o Tablestore é um service de armazenamento chave-valor, ao usar insert overwrite table para gravar dados em uma tabela do Tablestore, o conteúdo completo da tabela de destino não é apagado. Apenas os valores das chaves que correspondem às chaves da tabela de source são sobrescritos.

Exemplos de processamento de dados corrompidos

  1. Crie uma tabela do Tablestore chamada mf_ots_test e prepare os dados. Para mais informações, consulte Quick Start for wide table model.

    O código de exemplo a seguir mostra os dados padrão da tabela do Tablestore.

    +----+-----------+---------------------------+
    | id | name      | desc                      |
    +----+-----------+---------------------------+
    | 1  | Zhang San | Zhang San's description   |
    +----+-----------+---------------------------+
  2. Crie uma tabela externa do MaxCompute.

    CREATE EXTERNAL TABLE IF NOT EXISTS mf_ots_external_permi
    (
     id string,
    	name bigint,
    	desc string,
    	corrupt_col string
    )
    STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
    WITH SERDEPROPERTIES (
      'tablestore.columns.mapping'=':id,name,desc',
      'tablestore.table.name'='mf_ots_test',
      'tablestore.read.mode'='permissive',
      'tablestore.corrupt.column'='corrupt_col',
      'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole'
    )
    LOCATION 'tablestore://santie-doc.cn-shanghai.ots-internal.aliyuncs.com';
  3. Execute o código a seguir para consultar os dados na tabela externa do MaxCompute:

    -- Query data
    SELECT * FROM mf_ots_external_permi;

    O resultado a seguir é retornado. O campo de erro é gravado na coluna corrupt_col no formato JSON.

    +------------+------------+--------------------------+------------------------+
    | id         | name       | desc                     | corrupt_col            |
    +------------+------------+--------------------------+------------------------+
    | 1          | NULL       | Description of Zhang San | {"name": "\"Zhang San\""} |
    +------------+------------+--------------------------+------------------------+
    Nota

    Se tablestore.read.mode não estiver configurado ou estiver definido como permissive, mas tablestore.corrupt.column não estiver configurado para especifique a coluna na qual os dados corrompidos serão gravados, a mensagem de erro "Columns not match with columns mapping and corrupt column" será retornada ao consultar a tabela externa.

Perguntas frequentes

Como resolver jobs SQL lentos em tabelas externas do Tablestore?

  • Consultas lentas em tabelas externas do Tablestore

    • Sintoma

      As consultas em uma tabela externa do Tablestore são lentas. Para os mesmos dados de negócio, uma cópia é gravada no Tablestore em tempo real e outra é gravada no MaxCompute de forma agendada. Os schemas de tabela e os volumes de dados são idênticos. Uma consulta na tabela interna do MaxCompute é muito mais rápida do que na tabela externa do Tablestore.

    • Solução

      Esse problema pode ocorrer quando você execute múltiplos cálculos sobre o mesmo conjunto de dados. Em vez de ler os dados do Tablestore a cada consulta, o método mais eficiente é importar os dados necessários para uma tabela interna do MaxCompute e execute as consultas nessa tabela.

  • Pesquisa lenta de dados em tabelas externas do MaxCompute via SDK

    • Sintoma

      As pesquisas de dados em uma tabela externa do MaxCompute realizadas por meio de um SDK são lentas.

    • Solução

      As tabelas externas suportam apenas varreduras completas de tabela, o que pode causar lentidão. Use uma tabela interna do MaxCompute como alternativa.