Todos os produtos
Search
Central de documentação

MaxCompute:Tabelas externas do Tablestore

Última atualização: Jun 26, 2026

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

Contexto

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

Use o DataWorks com o MaxCompute para criar, pesquisar, consultar, configurar, processar e analisar tabelas externas visualmente. Para mais detalhes, acesse Tabelas externas.

Observações de uso

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

  • Os sistemas de tipos de dados do Tablestore e do MaxCompute são diferentes. A tabela a seguir apresenta os mapeamentos entre os tipos suportados por ambos.

    Tipo no MaxCompute

    Tipo no Tablestore

    STRING

    STRING

    BIGINT

    INTEGER

    DOUBLE

    DOUBLE

    BOOLEAN

    BOOLEAN

    BINARY

    BINARY

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

Pré-requisitos

Criar uma tabela externa

O MaxCompute oferece o recurso de tabelas externas, que permite importar dados do Tablestore para o sistema de metadados do MaxCompute visando seu processamento. A seção a seguir explica como criar uma tabela externa do Tablestore.

Veja abaixo 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/aliyunodpsdefaultrole',
  '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 abaixo detalha os principais parâmetros utilizados na instrução de criação anterior.

Parâmetro

Obrigatório

Descrição

com.aliyun.odps.TableStoreStorageHandler

Sim

Handler de armazenamento nativo do MaxCompute utilizado para processar dados do Tablestore. Ele define a interação entre o MaxCompute e o Tablestore, com toda a lógica implementada pelo próprio MaxCompute.

tablestore.columns.mapping

Sim

Colunas da tabela do Tablestore que o MaxCompute acessará, incluindo chaves primárias e colunas de atributos.

  • Dois pontos (:) no início do nome indicam que se trata de uma coluna de chave primária, como :o_orderkey e :o_orderdate no exemplo. As demais são colunas de atributos.

  • O Tablestore aceita de 1 a 4 colunas de chave primária, cujos tipos podem ser STRING, INTEGER ou BINARY. A primeira chave primária atua como chave de partição.

  • Ao definir os mapeamentos, especifique todas as colunas de chave primária da tabela do Tablestore indicada, além das colunas de atributos que serão acessadas via MaxCompute.

tablestore.table.name

Sim

Nome da tabela do Tablestore a ser acessada pelo MaxCompute. Neste exemplo, o nome é ots_tpch_orders.

odps.properties.rolearn

Sim

ARN (Alibaba Cloud Resource Name) da função AliyunODPSDefaultRole no RAM.

  1. Faça login no RAM console.

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

  3. Na página Roles, clique em Role Name desejado para abrir os detalhes da função.

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

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

tablestore.timestamp.ticks.unit

Não

Configuração de tipo temporal no nível da tabela. Define uma unidade de tempo única para todos os campos do tipo INTEGER na tabela externa. Valores válidos:

  • Seconds

  • millis

  • micros (microssegundos)

  • nanos

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

Não

Configuração de tipo temporal no nível da coluna. Especifica a unidade de tempo para uma coluna específica da tabela externa. Valores válidos:

  • seconds

  • millis (milissegundos)

  • micros

  • nanos

Nota

Caso tablestore.timestamp.ticks.unit e tablestore.column.<col1_name>.timestamp.ticks.unit estejam configurados simultaneamente, o parâmetro tablestore.column.<col1_name>.timestamp.ticks.unit terá precedência.

tablestore.table.put.row

Não

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

  • True: ativado.

  • False (padrão): desativado.

Nota

Para especificar o modo de escrita da operação PutRow, configure o parâmetro flag abaixo. O valor padrão é False. Consulte Lista de parâmetros flag para mais detalhes.

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

tablestore.read.mode

Não

Determina o comportamento de leitura caso o MaxCompute encontre dados corrompidos na tabela externa do Tablestore. Valores válidos:

  • permissive (padrão): o MaxCompute ignora os dados corrompidos detectados.

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

Para exemplos de tratamento de dados corrompidos, consulte Tabelas externas do Tablestore.

tablestore.corrupt.column

Não

Indica a coluna onde os dados corrompidos serão gravados.

  • Necessário apenas quando tablestore.read.mode estiver definido como permissive.

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

  • Não é permitido especificar uma coluna de chave primária do Tablestore.

Para exemplos de tratamento de dados corrompidos, consulte Tabelas externas do Tablestore.

LOCATION

Sim

Especifica informações do Tablestore, como nome e endpoint da instância. É necessário concluir a autorização via RAM ou Security Token Service (STS) para garantir acesso seguro aos dados.

Nota

Se houver erro indicando inconsistência de tipos de rede ao usar o endpoint público, altere o tipo de rede para rede clássica.

Execute a instrução abaixo para visualizar a estrutura da tabela externa criada:

DESC extended <table_name>;
Nota

No resultado da execução, o campo Extended Info contém informações básicas da tabela externa, detalhes do handler de armazenamento e a localização da tabela.

Consultar dados na tabela externa

Após criar a tabela externa, execute instruções 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

Em consultas a tabelas ou campos externos, os nomes não diferenciam maiúsculas de minúsculas, e conversões forçadas de caixa não são suportadas.

Ao acessar dados do Tablestore via SQL do MaxCompute, todas as operações — incluindo a seleção de colunas — ocorrem dentro do MaxCompute. No exemplo anterior, utilizam-se os nomes odps_orderkey e odps_totalprice, e não os nomes originais da chave primária (o_orderkey) e da coluna de atributo (o_totalprice) do Tablestore. Isso acontece porque os mapeamentos foram definidos na instrução DDL de criação da tabela externa. Se preferir, mantenha os nomes originais das chaves primárias e colunas de atributos do Tablestore conforme sua necessidade.

Para calcular o mesmo conjunto de dados várias vezes, importe-os do Tablestore para uma tabela interna do MaxCompute. Assim, evita-se a leitura repetida dos dados diretamente do Tablestore a cada nova computação. Exemplo:

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

A tabela internal_orders é uma tabela nativa do MaxCompute e suporta todos os recursos desse tipo de tabela. Ela utiliza armazenamento colunar altamente comprimido e mantém metadados internos completos, além de informações estatísticas. Por residir no MaxCompute, o acesso a internal_orders é mais rápido do que a consulta direta ao Tablestore. Essa abordagem é ideal para dados que exigem processamento recorrente.

Exportar dados do MaxCompute para o Tablestore

Nota

O MaxCompute não cria automaticamente a tabela de destino no Tablestore. Antes de exportar dados, certifique-se de que a tabela já exista; caso contrário, um erro será retornado.

Suponha que uma tabela externa chamada ots_table_external tenha sido criada para permitir que o MaxCompute acesse a tabela ots_tpch_orders no Tablestore, e que os dados estejam armazenados na tabela interna internal_orders. Para processar esses dados e gravá-los de volta no Tablestore, utilize 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 pelas chaves primárias, eles serão gravados em uma única partição da tabela do Tablestore, impedindo o aproveitamento total das operações de escrita distribuída. Nesse cenário, recomenda-se o uso de distribute by rand() para distribuir os dados aleatoriamente. 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;

Como o Tablestore é um serviço de armazenamento NoSQL baseado em pares chave-valor, a saída de dados do MaxCompute afeta apenas as linhas que contêm as chaves primárias da tabela de destino. Neste exemplo, somente as linhas com odps_orderkey e odps_orderdate são impactadas. Apenas as colunas de atributos especificadas durante a criação da tabela ots_table_external serão atualizadas; as demais permanecem inalteradas.

Nota
  • Tentativas de escrever mais de 4 MB de dados do MaxCompute para o Tablestore de uma só vez podem gerar erros. Nesses casos, remova o excesso de dados e tente novamente.

    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
  • A escrita de múltiplas entradas simultaneamente ou linha a linha conta como uma única operação. Consulte BatchWriteRow para mais informações. Para grandes volumes de dados, considere a escrita linha a linha.

  • Ao escrever várias entradas de uma vez, evite linhas duplicadas. Caso existam duplicatas, o seguinte erro pode ocorrer:

    ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalid 

    Para mais detalhes, consulte Erro OTSParameterInvalid ao enviar 100 entradas de dados por vez com BatchWriteRow.

  • Por ser um serviço de armazenamento chave-valor, o Tablestore não limpa todo o conteúdo da tabela de destino quando se usa insert overwrite table. Apenas os valores das chaves correspondentes às da tabela de origem são sobrescritos.

Exemplos de tratamento de dados corrompidos

  1. Crie uma tabela no Tablestore chamada mf_ots_test e prepare os dados. Consulte Início rápido para modelo de tabela ampla para orientações.

    O código abaixo mostra os dados padrão dessa tabela.

    +----+-----------+---------------------------+
    | id | name      | desc                      |
    +----+-----------+---------------------------+
    | 1  | Zhang San | Zhang San's description   |
    +----+-----------+---------------------------+
  2. Crie uma tabela externa no 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 da tabela externa do MaxCompute:

    -- Query data
    SELECT * FROM mf_ots_external_permi;

    O resultado retornado é exibido abaixo. O campo com erro foi gravado na coluna corrupt_col em 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 especificar a coluna para gravação de dados corrompidos, a consulta à tabela externa retornará a mensagem de erro "Columns not match with columns mapping and corrupt column".

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 apresentam desempenho baixo. Para os mesmos dados de negócio, uma cópia é gravada em tempo real no Tablestore e outra é carregada periodicamente no MaxCompute. Embora os esquemas e volumes sejam idênticos, a consulta na tabela interna do MaxCompute é significativamente mais rápida.

    • Solução

      Esse problema geralmente ocorre quando se executam múltiplos cálculos sobre o mesmo conjunto de dados. Em vez de ler o Tablestore a cada consulta, importe os dados necessários para uma tabela interna do MaxCompute e realize as consultas nessa tabela interna para obter melhor eficiência.

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

    • Sintoma

      A busca de dados em uma tabela externa do MaxCompute utilizando um kit de desenvolvimento de software (SDK) apresenta lentidão.

    • Solução

      Tabelas externas suportam apenas varreduras completas (full table scans), o que pode comprometer o desempenho. Utilize uma tabela interna do MaxCompute como alternativa.