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
Você deve ter permissões de acesso ao Tablestore. Para detalhes sobre autorização, consulte Autorização STS para Tablestore.
Crie uma instância, uma tabela e dados no Tablestore. Para mais informações, veja Início rápido para modelo de tabela ampla.
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.
|
tablestore.table.name | Sim | Nome da tabela do Tablestore a ser acessada pelo MaxCompute. Neste exemplo, o nome é |
odps.properties.rolearn | Sim | ARN (Alibaba Cloud Resource Name) da função AliyunODPSDefaultRole no RAM.
|
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:
|
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:
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:
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. |
tablestore.read.mode | Não | Determina o comportamento de leitura caso o MaxCompute encontre dados corrompidos na tabela externa do Tablestore. Valores válidos:
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.
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>;
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;
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
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;
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.
-
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 invalidPara 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
-
Crie uma tabela no Tablestore chamada
mf_ots_teste 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 | +----+-----------+---------------------------+ -
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'; -
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_colem formato JSON.+------------+------------+--------------------------+------------------------+ | id | name | desc | corrupt_col | +------------+------------+--------------------------+------------------------+ | 1 | NULL | Description of Zhang San | {"name": "\"Zhang San\""} | +------------+------------+--------------------------+------------------------+NotaSe 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.
-