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
Você deve ter as permissões necessárias para acessar o Tablestore. Para mais informações sobre autorização, consulte STS authorization for Tablestore.
Uma instância, uma tabela e os dados do Tablestore devem estar criados. Para mais informações, consulte Quick Start for wide table model.
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âmetroodps.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.
|
tablestore.table.name | Yes | O nome da tabela do Tablestore que o MaxCompute deve acessar. Neste exemplo, o nome é |
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.
|
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:
|
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:
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:
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. |
tablestore.read.mode | No | Defina o comportamento de leitura quando o MaxCompute detecta dados corrompidos na tabela externa do Tablestore. Valores válidos:
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.
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>;
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;
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
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;
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.
-
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 invalidPara 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 tablepara 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
-
Crie uma tabela do Tablestore chamada
mf_ots_teste 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 | +----+-----------+---------------------------+ -
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'; -
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_colno 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 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.
-