Crie uma tabela externa do ApsaraDB for MySQL e grave dados nela pela rede pública ou por uma VPC.
Introdução
O ApsaraDB for RDS (Relational Database Service) é um service gerenciado de banco de dados relacional da Alibaba Cloud, geralmente acessado por meio de um endpoint interno. O MaxCompute permite ler e gravar dados em tabelas de uma instância do ApsaraDB for MySQL.
Limitações
Limitações de região: As seguintes regiões têm suporte: China (Beijing), China (Shanghai), China (Zhangjiakou), China (Ulanqab), China (Hangzhou), China (Shenzhen), China (Hong Kong), China (Shanghai) Finance Cloud (Zone F), Japan (Tokyo), Singapore, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Germany (Frankfurt), US (Silicon Valley) e US (Virginia).
Limitações de mecanismo: Apenas as versões 5.x e 8,0 do ApsaraDB for MySQL têm suporte. Outros mecanismos do ApsaraDB for RDS não são compatíveis.
Nomes de domínio PrivateZone não têm suporte.
Tabelas externas do ApsaraDB for MySQL não oferecem suporte à propriedade de cluster.
Ao gravar grandes volumes de dados em uma tabela externa do ApsaraDB for MySQL, o MaxCompute utiliza um método de gravação paralela com múltiplos processos. Em casos raros, um processo de gravação pode reescrever dados, resultando em duplicatas.
Limite de escala: Para tabelas externas do RDS no MaxCompute, o tipo de dados
DECIMALpossui uma escala padrão de 18 que não pode ser modificada. O tipo de dados é criado comoDECIMAL(38,18). Caso necessite de menos casas decimais, defina o tipo de dados comoStringdurante a criação da tabela externa. Em seguida, utilize a funçãoCASTpara converter o tipo ao usar os dados.
Observações sobre incompatibilidade de schema
Se o schema da tabela de source do ApsaraDB for MySQL não corresponder ao schema da tabela externa:
Incompatibilidade na contagem de colunas: Se a tabela de source do ApsaraDB for MySQL tiver menos colunas do que o especificado na DDL da tabela externa, o sistema reportará um erro durante a leitura dos dados. Um exemplo de erro é
Unknown column 'xxx' in 'field list'. Se a tabela de source possuir mais colunas do que o definido na DDL da tabela externa, o sistema descartará os dados das colunas excedentes.Incompatibilidade de tipo de coluna: Não é possível ler dados STRING da tabela de source como o tipo INT. Embora seja possível ler dados INT como o tipo STRING, essa prática não é recomendada.
Criar uma tabela externa
Sintaxe
Os nomes de tabelas e colunas não diferenciam maiúsculas de minúsculas. Não há suporte para conversão forçada de caixa.
-- Enable Hive-compatible mode.
SET odps.sql.hive.compatible = true;
CREATE EXTERNAL TABLE <table_name>(
<col_name1> <data_type>,
<col_name2> <data_type>,
......
)
STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' -- The handler for JDBC-connected data sources.
location '<jdbc:mysql://<realm_name:port>/<rds_database_name>?useSSL=false&user=<user_name>&password=<password_value>&table=<rds_table_name>>'
TBLPROPERTIES(
['odps.federation.jdbc.colmapping'='<col_name1:rdstable_colname1|select_alias1>,[<col_name2:rdstable_colname2|select_alias2>,...]',]
'mcfed.mapreduce.jdbc.input.query'='<select_sentence>',
'networklink'='<networklink_name>');
Parâmetros
table_name: Obrigatório. O nome da tabela externa.
col_name: Obrigatório. O nome de uma coluna na tabela externa.
data_type: Obrigatório. O tipo de dados da coluna.
-
jdbc:mysql://realm_name:port/rds_database_name?useSSL=false&user=user_name&password=password_value&table=rds_table_name: Obrigatório. A string de conexão para a tabela de source do ApsaraDB for MySQL.
Se a string de conexão contiver caracteres especiais, codifique-os em URL. Para mais informações, consulte URL_ENCODE.
-
realm_name:port: O endpoint interno e a porta da instância do ApsaraDB for RDS.
Faça login no RDS console.
No painel de navegação à esquerda, selecione Instances e, no canto superior esquerdo, selecione a região.
Na página Instances, clique em Instance ID/Name da instância desejada para abrir a página Instance Details.
No painel de navegação à esquerda, clique em Database Connection.
Visualize o Internal Endpoint, o Public Endpoint e a Internal Port: do banco de dados.
rds_database_name: O nome do banco de dados do ApsaraDB for MySQL.
user_name: O nome de usuário da conta do banco de dados do ApsaraDB for MySQL.
password_value: A senha da conta do banco de dados do ApsaraDB for MySQL.
rds_table_name: O nome da tabela de source do ApsaraDB for MySQL.
-
-
TBLPROPERTIES:
-
odps.federation.jdbc.colmapping: Opcional.
O mapeamento entre as colunas da tabela externa do MaxCompute e as colunas da tabela de source do ApsaraDB for MySQL. A quantidade de colunas mapeadas deve corresponder ao número de colunas definidas na tabela externa do MaxCompute.
No mapeamento, rdstable_colname é um nome de coluna na tabela de source do ApsaraDB for MySQL (usado para mapear todas as colunas), e select_alias é um alias de coluna no resultado da consulta (usado para mapear colunas específicas).
Se este parâmetro não for configurado, o MaxCompute mapeará as colunas pelo nome.
Se você mapear apenas algumas colunas, o MaxCompute as mapeará conforme especificado e tentará mapear as colunas restantes pelo nome. Ocorrerá um erro se houver incompatibilidade de nome ou tipo nas colunas mapeadas automaticamente.
-
mcfed.mapreduce.jdbc.input.query: Opcional.
Especifica uma consulta para ler dados da tabela de source do ApsaraDB for MySQL. O schema da tabela externa (contagem de colunas, nomes e tipos de dados) deve corresponder exatamente ao schema do resultado da consulta, incluindo quaisquer aliases. O formato de
select_sentenceéSELECT xxx FROM <rds_database_name>.<rds_table_name>. -
networklink: Obrigatório. O nome da conexão de rede do MaxCompute para a VPC onde reside a instância do ApsaraDB for RDS.
Faça login no MaxCompute console e selecione uma região no canto superior esquerdo.
No painel de navegação à esquerda, escolha .
-
Na página Network Connection, localize o nome da conexão de rede para a VPC onde sua instância do ApsaraDB for RDS reside.
Após fazer login no RDS console e selecionar uma instância, clique em Database Connection no painel de navegação à esquerda para visualizar a VPC onde o banco de dados está localizado.
-
Procedimento
Crie uma tabela externa do MaxCompute mapeada para uma source de dados do ApsaraDB for MySQL e carregue dados nela:
-
Garanta que haja uma conexão de rede estabelecida entre o MaxCompute e o ApsaraDB for RDS. Para mais informações, consulte Solutions for accessing the public network.
Depois que a conexão de rede for estabelecida, o MaxCompute poderá se conectar apenas à rede do ID de VPC especificado. Para acessar outras regiões ou outras VPCs na mesma região, estabeleça conectividade entre a VPC conectada e as VPCs de destino com base na sua solução existente de conectividade de VPC.
-
Faça login no banco de dados do ApsaraDB for MySQL, crie uma tabela e insira dados. Para mais informações, consulte Log on to an ApsaraDB for MySQL instance by using Data Management Service (DMS).
Faça login no RDS console.
No painel de navegação à esquerda, selecione Instances e, no canto superior esquerdo, selecione a região.
-
Se você não tiver nenhuma instância, clique em Create Instance na página Instances. Caso contrário, clique em Instance ID/Name da instância desejada para abrir sua página de detalhes.
Ao criar uma instância, defina o mecanismo do RDS como ApsaraDB for MySQL 5.x ou 8,0. Outros mecanismos do ApsaraDB for RDS não têm suporte.
No painel de navegação à esquerda, clique em Databases.
-
Clique em Create Database. Configure os seguintes parâmetros:
Parâmetro
Obrigatório
Descrição
Exemplo
Nome do banco de dados
Sim
-
O nome deve ter entre 2 e 64 caracteres.
-
O nome deve começar com uma letra e terminar com uma letra ou dígito.
-
O nome pode conter letras minúsculas, dígitos, sublinhados (_) e hifens (-).
-
O nome do banco de dados deve ser único dentro da instância.
-
Se um nome de banco de dados contiver um
-, o-no nome da pasta do banco de dados criado será alterado para@002d.
rds_mc_testConjunto de caracteres suportado
Sim
Selecione um conjunto de caracteres com base nos requisitos do seu negócio.
utf8Conta autorizada
Opcional
-
Selecione uma conta autorizada a acessar o banco de dados. Você pode deixar este parâmetro vazio e attach an account após a criação do banco de dados.
-
Apenas contas padrão são exibidas. Contas privilegiadas têm permissões para acessar todos os bancos de dados e não requerem autorização.
DefaultDescrição
Opcional
Uma descrição opcional para o banco de dados, com até 256 caracteres, para auxiliar no gerenciamento.
Test database for an ApsaraDB for MySQL external table -
-
Clique em Log On to Database. No painel de navegação à esquerda, selecione Instance e clique duas vezes no banco de dados criado. Na página SQL Console à direita, execute as seguintes instruções para criar uma tabela de teste e gravar dados de teste.
Se a instância existir, mas você não conseguir encontrar o banco de dados alvo após expandir a instância, as possíveis causas incluem:
A conta de login não tem permissões de acesso ao banco de dados alvo: Acesse a página Accounts na página de detalhes da instância RDS para modify account permissions ou change the logon database account manualmente.
O diretório não é exibido porque os metadados não estão sincronizados: Passe o mouse sobre a instância e clique no ícone
à direita do nome da instância para atualizar a lista e exibir o banco de dados.
-
Instruções de exemplo:
CREATE TABLE `rds_mc_external` ( `id` int(11) DEFAULT NULL, `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"Alice"); INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"Bob");
-
Crie uma tabela externa no cliente MaxCompute mapeada para a source de dados do ApsaraDB for MySQL
Mapear todas as colunas
-
No cliente MaxCompute, crie uma tabela externa cujos nomes de colunas correspondam aos nomes das colunas na tabela do ApsaraDB for MySQL. Exemplo:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external_mapping ( id INT, name STRING ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_mc_test?useSSL=false&user=<your_username>&password=<your_password>&table=rds_mc_external' TBLPROPERTIES( 'mcfed.mapreduce.jdbc.input.query'='select * from rds_mc_test.rds_mc_external', 'networklink'='<your_network_connection_name>'); -
Insira dados na nova tabela do MaxCompute.
INSERT INTO TABLE mc_vpc_rds_external VALUES(2,"Zoey"); -
Consulte o resultado.
-- Query the data insertion result. SELECT * FROM mc_vpc_rds_external; -- The following result is returned: +------------+------------+ | id | name | +------------+------------+ | 1 | Alice | | 1 | Bob | | 2 | Zoey | +------------+------------+
Mapear colunas específicas
-
No cliente MaxCompute, crie uma tabela externa e mapeie suas colunas para colunas específicas na tabela do ApsaraDB for MySQL. Exemplo:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external ( id INT, name STRING) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_mc_test?useSSL=false&user=<your_username>&password=<your_password>&table=rds_mc_external' TBLPROPERTIES( 'odps.federation.jdbc.colmapping'='key:id,value:name', 'mcfed.mapreduce.jdbc.input.query'='select * from rds_mc_test.rds_mc_external', 'networklink'='<your_network_connection_name>'); -
Insira dados na nova tabela do MaxCompute.
INSERT INTO TABLE mc_vpc_rds_external_mapping VALUES(4,"Lisa"); -
Consulte o resultado da inserção de dados.
SELECT * FROM mc_vpc_rds_external_mapping; -- The following result is returned: +------------+------------+ | id | name | +------------+------------+ | 1 | Alice | | 1 | Bob | | 4 | Lisa | +------------+------------+
-