AnalyticDB for MySQL permite importar dados externos por meio de tabelas externas. Este tópico explica como usar esse recurso para importar dados do OSS para um cluster AnalyticDB for MySQL.
Pré-requisitos
O cluster AnalyticDB for MySQL e o bucket do OSS devem estar na mesma região. Para mais informações, consulte Activate OSS.
Você já enviou os data files para um diretório do OSS.
-
O acesso à interface de rede elástica (ENI) está ativado no cluster AnalyticDB for MySQL Data Warehouse Edition.
ImportanteFaça login no console do AnalyticDB for MySQL. Na página Cluster Information, em Network Information, ative o switch de rede ENI.
Ativar ou desativar a rede ENI interrompe a conectividade do banco de dados por cerca de 2 minutos, tornando as operações de leitura e gravação indisponíveis. Avalie cuidadosamente o impacto antes de ativar ou desativar a rede ENI.
Preparação dos dados
Este exemplo envia o arquivo de dados person.csv para o diretório testBucketName/adb/dt=2023-06-15 no OSS. O arquivo usa quebra de linha como delimitador de linhas e vírgula (,) como delimitador de colunas. O arquivo person.csv contém os seguintes dados de amostra:
1,james,10,2023-06-15
2,bond,20,2023-06-15
3,jack,30,2023-06-15
4,lucy,40,2023-06-15
Procedimento
Enterprise, basic, and data lakehouse editions
-
Acesse o editor SQL Development.
Faça login no console do AnalyticDB for MySQL. No canto superior esquerdo do console, selecione uma região. No painel de navegação à esquerda, clique em Clusters. Localize o cluster que deseja gerenciar e clique no ID do cluster.
No painel de navegação à esquerda, escolha .
-
Importe os dados.
É possível importar dados usando a importação regular (padrão) ou a importação elástica. No modo de importação regular, o sistema lê os dados de origem nos nós de computação e cria índices nos nós de armazenamento, consumindo recursos de computação e armazenamento. A importação elástica é suportada apenas em clusters Enterprise Edition, Basic Edition e Data Lakehouse Edition com versão de kernel 3.1.10.0 ou posterior que possuam um grupo de recursos do tipo job. Para mais informações, consulte Data import methods.
Regular import
-
Crie um banco de dados externo.
CREATE EXTERNAL DATABASE adb_external_db; -
Crie uma tabela externa. Use a instrução CREATE EXTERNAL TABLE para criar uma tabela externa do OSS no banco de dados externo
adb_external_db. Este tópico usa adb_external_db.person como exemplo.NotaA tabela externa do AnalyticDB for MySQL deve ter os mesmos nomes de campos, quantidade de campos, ordem dos campos e tipos de dados do arquivo de origem no OSS.
Para mais informações sobre a sintaxe de criação de tabelas externas do OSS, consulte CREATE EXTERNAL TABLE.
-
Consulte os dados.
Após criar a tabela externa, execute uma instrução SELECT no AnalyticDB for MySQL para consultar dados do OSS.
SELECT * FROM adb_external_db.person;O resultado retornado é:
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ -
Crie um banco de dados no AnalyticDB for MySQL. Se já existir um banco de dados, ignore esta etapa. Exemplo de instrução:
CREATE DATABASE adb_demo; -
Crie uma tabela no AnalyticDB for MySQL para armazenar os dados importados do OSS. Exemplo de instrução:
NotaA tabela interna deve corresponder à tabela externa da etapa b em nomes de campos, quantidade de campos, ordem dos campos e tipos de dados.
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Importe os dados para a tabela.
-
Método 1: Use a instrução
INSERT INTO. Se houver duplicidade de chave primária, os novos dados serão ignorados. Isso equivale aINSERT IGNORE INTO. Para mais informações, consulte INSERT INTO. Exemplo:INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Método 2: Use a instrução
INSERT OVERWRITE INTOpara importar dados de forma síncrona. Essa operação substitui os dados existentes na tabela. Exemplo:INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Método 3: Use a instrução
INSERT OVERWRITE INTOpara importar dados de forma assíncrona. Para mais informações, consulte asynchronous write. Exemplo:SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
Elastic import
-
Crie um banco de dados. Se já existir um banco de dados, ignore esta etapa. Exemplo de instrução:
CREATE DATABASE adb_demo; -
Crie uma tabela externa.
NotaA tabela externa do AnalyticDB for MySQL deve ter os mesmos nomes de campos, quantidade de campos, ordem dos campos e tipos de dados do arquivo de origem no OSS.
A importação elástica suporta apenas a criação de tabelas externas com a instrução
CREATE TABLE.
CREATE TABLE oss_import_test_external_table ( id INT(1023), name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketName/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":"," }';ImportanteAo criar uma tabela externa, os parâmetros TABLE_PROPERTIES suportados variam conforme o formato do arquivo (CSV, Parquet ou ORC):
Formato CSV: Apenas os parâmetros
endpoint,url,accessid,accesskey,format,delimiter,null_value,maxlinelengthepartition_columnsão suportados.Formato Parquet: Somente os parâmetros
endpoint,url,accessid,accesskey,format,maxlinelengthepartition_columnsão aceitos.Formato ORC: Apenas os parâmetros
endpoint,url,accessid,accesskey,format,maxlinelengthepartition_columntêm suporte.
Para mais detalhes sobre os parâmetros configuráveis em tabelas externas e suas descrições, consulte OSS non-partitioned external tables e OSS partitioned external tables.
-
Consulte os dados.
Depois de criar a tabela externa, execute uma instrução SELECT no AnalyticDB for MySQL para consultar dados do OSS.
SELECT * FROM oss_import_test_external_table;O resultado retornado é:
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ 4 rows in set (0.35 sec) -
Crie uma tabela no AnalyticDB for MySQL para armazenar os dados importados do OSS. Exemplo de instrução:
NotaA tabela interna deve corresponder à tabela externa da etapa b em nomes de campos, quantidade de campos, ordem dos campos e tipos de dados.
CREATE TABLE adb_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Importe os dados.
ImportanteA importação elástica suporta a importação de dados apenas por meio da instrução
INSERT OVERWRITE INTO.-
Método 1: Execute a instrução INSERT OVERWRITE INTO para importar dados elasticamente, substituindo os dados existentes na tabela. Exemplo de instrução:
/*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
-
Método 2: Execute assincronamente a instrução INSERT OVERWRITE INTO para importar dados de forma elástica. Use a instrução
SUBMIT JOBpara enviar uma tarefa assíncrona que será agendada em segundo plano./*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ SUBMIT JOB INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;ImportanteNão é possível definir uma fila de prioridade ao enviar uma tarefa de importação elástica de forma assíncrona.
O resultado retornado é:
+---------------------------------------+ | job_id | +---------------------------------------+ | 202308151719510210170190********** |
Após enviar uma tarefa assíncrona usando
SUBMIT JOB, o resultado retornado indica apenas que a tarefa foi enviada com sucesso. Use o ID do job para encerrar a tarefa assíncrona ou consultar seu status e verificar se a execução foi concluída corretamente. Para mais informações, consulte Submit an asynchronous import job.Parâmetros de hint:
elastic_load: define se a importação elástica será usada. Valores válidos: true e false. Valor padrão: false.
-
elastic_load_configs: parâmetros de configuração do recurso de importação elástica. Os parâmetros devem ser colocados entre colchetes ([ ]) e separados por barras verticais (|). A tabela a seguir descreve esses parâmetros.
Parameter
Required
Description
adb.load.resource.group.name
Yes
Nome do grupo de recursos de job que executa a tarefa de importação elástica.
adb.load.job.max.acu
No
Quantidade máxima de recursos para uma tarefa de importação elástica. Unidade: AnalyticDB compute units (ACUs). Valor mínimo: 5 ACUs. Valor padrão: número de shards mais 1.
Execute a seguinte instrução para consultar o número de shards no cluster:
SELECT count(1) FROM information_schema.kepler_meta_shards;spark.driver.resourceSpec
No
Tipo de recurso do driver Spark. Valor padrão: small. Para informações sobre os valores válidos, consulte a coluna Type na tabela "Spark application configuration parameters" do tópico de parâmetros de configuração Conf.
spark.executor.resourceSpec
No
Tipo de recurso do executor Spark. Valor padrão: large. Para informações sobre os valores válidos, consulte a coluna Type na tabela "Spark application configuration parameters" do tópico de parâmetros de configuração Conf.
spark.adb.executorDiskSize
No
Capacidade de disco do executor Spark. Valores válidos: (0.100]. Unidade: GiB. Valor padrão: 10 GiB. Para mais informações, consulte a seção "Specify driver and executor resources" do tópico de parâmetros de configuração Conf.
-
-
(Opcional) Verifique se a tarefa de importação enviada é uma tarefa de importação elástica.
SELECT job_name, (job_type = 3) AS is_elastic_load FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where job_name = "2023081818010602101701907303151******";O resultado retornado é:
+---------------------------------------+------------------+ | job_name | is_elastic_load | +---------------------------------------+------------------+ | 20230815171951021017019072*********** | 1 | +---------------------------------------+------------------+Se o valor de
is_elastic_loadfor 1, a tarefa de importação enviada é uma tarefa de importação elástica. Se o valor for 0, trata-se de uma tarefa de importação regular.
-
Data warehouse edition
-
Connect to a cluster e crie um banco de dados.
CREATE DATABASE adb_demo; -
Crie uma tabela externa. Use a sintaxe CREATE TABLE para criar uma tabela externa do OSS nos formatos CSV, Parquet ou ORC. Para mais informações sobre a sintaxe, consulte OSS external table syntax.
Este tópico usa como exemplo uma tabela externa não particionada no formato CSV.
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":",", "skip_header_line_count":0, "charset":"utf-8" }'; -
Consulte dados na tabela externa
oss_import_test_external_table.NotaPara arquivos de dados CSV, Parquet ou ORC, consultar uma tabela externa grande pode causar sobrecarga significativa de desempenho. Para melhorar a eficiência da consulta, recomendamos importar os dados da tabela externa do OSS para o AnalyticDB for MySQL antes de executar consultas, conforme descrito nas Etapas 4 e 5.
SELECT * FROM oss_import_test_external_table; -
Crie uma tabela no AnalyticDB for MySQL para armazenar os dados importados da tabela externa do OSS.
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id); -
Execute uma instrução INSERT para importar dados da tabela externa do OSS para o AnalyticDB for MySQL.
ImportantePor padrão, as operações de importação de dados que usam
INSERT INTOouINSERT OVERWRITE SELECTsão executadas de forma síncrona. Para grandes conjuntos de dados, como aqueles na casa das centenas de gigabytes, o cliente precisa manter uma conexão persistente com o servidor AnalyticDB for MySQL por um longo período. Durante esse tempo, problemas de rede podem interromper a conexão e causar falha na importação. Portanto, para grandes volumes de dados, recomendamos o uso deSUBMIT JOB INSERT OVERWRITE SELECTpara realizar a importação de forma assíncrona.-
Método 1: Execute a instrução
INSERT INTOpara importar dados. Se houver duplicidade de chave primária, a operação de gravação atual será ignorada e os dados não serão atualizados. Esse comportamento equivale aINSERT IGNORE INTO. Para mais informações, consulte INSERT INTO. Exemplo de instrução:INSERT INTO adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
Método 2: Execute a instrução INSERT OVERWRITE para importar dados, substituindo os dados existentes na tabela. Exemplo de instrução:
INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table; -
Método 3: Execute assincronamente a instrução
INSERT OVERWRITEpara importar dados. UseSUBMIT JOBpara enviar uma tarefa assíncrona para agendamento em segundo plano. Adicione um hint (/*+ direct_batch_load=true*/) antes da tarefa de gravação para acelerar o processo. Para mais informações, consulte Asynchronous write. Exemplo de instrução:SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;O resultado retornado é:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |Para mais informações sobre como enviar uma tarefa assíncrona, consulte Submit an asynchronous import job.
-
Sintaxe de tabela externa do OSS
Enterprise, Basic, and Data Lakehouse
Para informações sobre a sintaxe de criação de tabelas externas do OSS na Enterprise Edition, Basic Edition e Data Lakehouse Edition, consulte OSS external tables.
Data Warehouse
Tabela externa não particionada do OSS
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"csv|orc|parquet|text
"delimiter|field_delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
External table type | Parameter | Required | Description |
Tabelas externas nos formatos CSV, Parquet e ORC | ENGINE='OSS' | Yes | Engine da tabela. Defina o valor como OSS. |
endpoint | O Endpoint do bucket do OSS. Atualmente, o AnalyticDB for MySQL acessa o OSS apenas via rede VPC. Nota Faça login no console do OSS, clique no bucket desejado e visualize o Endpoint na página Overview do bucket. | ||
url | Caminho para o arquivo ou diretório no OSS.
| ||
accessid | AccessKey ID de uma conta Alibaba Cloud ou usuário RAM com permissões de gerenciamento do OSS. Para informações sobre como obter um AccessKey ID, consulte Accounts and permissions. | ||
accesskey | AccessKey Secret de uma conta Alibaba Cloud ou usuário RAM com permissões de gerenciamento do OSS. Para obter um AccessKey Secret, consulte Accounts and permissions. | ||
format | Condicionalmente obrigatório | Formato do arquivo.
| |
maxlinelength | No | Valor padrão: 32768 (32 KB). Se o arquivo de dados contiver linhas que excedam esse comprimento, aumente o valor deste parâmetro. Exemplo: | |
Tabelas externas nos formatos CSV e Text | delimiter|field_delimiter | Yes | Delimitador de colunas do arquivo de dados.
|
Tabelas externas no formato CSV | null_value | No | Define o que representa um valor Importante Este parâmetro requer um cluster com versão de kernel 3.1.4.2 ou posterior. |
ossnull | Define a regra para interpretação de valores
Nota Os exemplos acima assumem que | ||
skip_header_line_count | Número de linhas a serem ignoradas no início do arquivo de dados. Por exemplo, se um arquivo CSV tiver uma linha de cabeçalho, defina este parâmetro como 1 para ignorá-la. O valor padrão é 0, indicando que nenhuma linha será ignorada. | ||
oss_ignore_quote_and_escape | Se definido como true, aspas e caracteres de escape nos valores dos campos serão ignorados. O padrão é false. Importante Este parâmetro requer um cluster com versão de kernel 3.1.4.2 ou posterior. | ||
charset | Conjunto de caracteres da tabela externa do OSS. Valores válidos:
Importante Este parâmetro requer um cluster com versão de kernel 3.1.10.4 ou posterior. |
Os nomes das colunas e sua ordem na instrução CREATE EXTERNAL TABLE devem corresponder aos do arquivo de origem Parquet ou ORC. Os nomes das colunas não diferenciam maiúsculas de minúsculas.
É possível criar uma tabela externa usando um subconjunto de colunas do arquivo de origem. As colunas não especificadas na instrução CREATE EXTERNAL TABLE serão ignoradas.
Se a instrução CREATE EXTERNAL TABLE incluir uma coluna que não existe no arquivo Parquet ou ORC, as consultas nessa coluna retornarão NULL.
O AnalyticDB for MySQL pode ler e gravar arquivos Hive TEXT usando uma tabela externa do OSS no formato CSV. Use a seguinte instrução para criar a tabela:
CREATE TABLE adb_csv_hive_format_oss (
a tinyint,
b smallint,
c int,
d bigint,
e boolean,
f float,
g double,
h varchar,
i varchar, -- binary
j timestamp,
k DECIMAL(10, 4),
l varchar, -- char(10)
m varchar, -- varchar(100)
n date
) ENGINE = 'OSS' TABLE_PROPERTIES='{
"format": "csv",
"endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';
Observe os seguintes pontos ao criar uma tabela externa do OSS no formato CSV para ler arquivos Hive TEXT:
O delimitador de colunas padrão para arquivos Hive TEXT é
\1. Ao usar uma tabela externa do OSS formatada em CSV para ler ou gravar esses arquivos, defina o parâmetrodelimitercom o valor escapado\\1.O valor
NULLpadrão para arquivos Hive TEXT é\N. Ao usar uma tabela externa do OSS formatada em CSV para ler ou gravar esses arquivos, defina o parâmetronull_valuecom o valor escapado\\\\N.Outros tipos básicos de dados do Hive, como
BOOLEAN, mapeiam diretamente para os tipos de dados do AnalyticDB for MySQL. No entanto, os tiposBINARY,CHAR(n)eVARCHAR(n)mapeiam todos para o tipo AnalyticDB for MySQLVARCHAR.
Apêndice: Mapeamento de tipos de dados
Os tipos de dados especificados durante a criação da tabela devem corresponder aos mapeamentos nas tabelas a seguir. Para o tipo
DECIMAL, a precisão também deve corresponder.Tabelas externas Parquet não suportam o tipo
STRUCT. Se você usar esse tipo, a criação da tabela falhará.Tabelas externas ORC não suportam tipos complexos como
LIST,STRUCTeUNION. Se você usar esses tipos, a criação da tabela falhará. É possível criar uma tabela externa ORC contendo uma coluna do tipoMAP, mas as consultas nessa tabela falharão.
Mapeamento de tipos de dados entre arquivos Parquet e **AnalyticDB for MySQL**
Parquet primitive type | Parquet logical type | AnalyticDB for MySQL type |
BOOLEAN | None | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | None | INT or INTEGER |
INT64 | None | BIGINT |
FLOAT | None | FLOAT |
DOUBLE | None | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP or DATETIME |
INT96 | None | TIMESTAMP or DATETIME |
Mapeamento de tipos de dados entre arquivos ORC e **AnalyticDB for MySQL**
ORC type | AnalyticDB for MySQL type |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
SHORT | SMALLINT |
INT | INT or INTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMP or DATETIME |
DATE | DATE |
Mapeamento de tipos de dados entre arquivos Paimon e **AnalyticDB for MySQL**
|
Paimon type |
AnalyticDB for MySQL type |
|
CHAR |
VARCHAR |
|
VARCHAR |
VARCHAR |
|
BOOLEAN |
BOOLEAN |
|
BINARY |
VARBINARY |
|
VARBINARY |
VARBINARY |
|
DECIMAL |
DECIMAL |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INT |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
REAL |
|
DOUBLE |
DOUBLE |
|
DATE |
DATE |
|
TIME |
Não suportado |
|
TIMESTAMP |
TIMESTAMP |
|
LocalZonedTIMESTAMP |
TIMESTAMP (ignora informações de fuso horário local) |
|
ARRAY |
ARRAY |
|
MAP |
MAP |
|
ROW |
ROW |