AnalyticDB for MySQL oferece suporte à importação de dados externos por meio de tabelas externas. Este tópico explica como usá-las para importar dados do OSS para um cluster do AnalyticDB for MySQL.
Pré-requisitos
O cluster do AnalyticDB for MySQL e o bucket do OSS estão na mesma região. Para mais informações, consulte Activate OSS.
Você enviou os arquivos de dados para um diretório do OSS.
-
O acesso à interface de rede elástica (ENI) está habilitado para o seu cluster do AnalyticDB for MySQL Data Warehouse Edition.
ImportanteAcesse o 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 de 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 uma quebra de linha como delimitador de linha e uma vírgula (,) como delimitador de coluna. O arquivo person.csv contém os seguintes dados de exemplo:
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
Edições Enterprise, Basic e Data Lakehouse
-
Acesse o editor de SQL Development.
Acesse o console do AnalyticDB for MySQL. No canto superior esquerdo do console, selecione uma região. No painel de navegação à esquerda, clique em Clusters. Encontre o cluster que deseja gerenciar e clique em 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 source dos nós de computação e cria índices nos nós de armazenamento, consumindo recursos de computação e armazenamento. O método de importação elástica é compatível apenas com clusters das edições Enterprise Edition, Basic Edition e Data Lakehouse Edition que executam a versão de kernel 3.1.10.0 ou posterior e possuem um grupo de recursos de job. Para mais informações, consulte Data import methods.
Importação regular
-
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 campo, número de campos, ordem dos campos e tipos de dados do arquivo source do OSS.
Para mais informações sobre a sintaxe de criação de tabelas externas do OSS, consulte CREATE EXTERNAL TABLE.
-
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 adb_external_db.person;O resultado retornado é o seguinte:
+------+-------+------+-----------+ | 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 campo, número 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 INTOpara importar dados. Se um valor de chave primária for duplicado, o sistema ignora os novos dados. Isso equivale ao uso deINSERT IGNORE INTO. Para mais informações, consulte INSERT INTO.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. Isso sobrescreve os dados existentes na tabela.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.SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
Importação elástica
-
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 campo, número de campos, ordem dos campos e tipos de dados do arquivo source do OSS.
A importação elástica é compatível apenas com a criação de tabelas externas por meio da 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 compatíveis variam de acordo com o formato do arquivo (CSV, Parquet ou ORC):
Formato CSV: são compatíveis apenas os parâmetros
endpoint,url,accessid,accesskey,format,delimiter,null_value,maxlinelengthepartition_column.Formato Parquet: são compatíveis apenas os parâmetros
endpoint,url,accessid,accesskey,format,maxlinelengthepartition_column.Formato ORC: são compatíveis apenas os parâmetros
endpoint,url,accessid,accesskey,format,maxlinelengthepartition_column.
Para mais informações sobre os parâmetros configuráveis para 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 é o seguinte:
+------+-------+------+-----------+ | 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 campo, número 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 permite importar dados apenas por meio da instrução
INSERT OVERWRITE INTO.-
Método 1: Execute a instrução INSERT OVERWRITE INTO para importar dados elasticamente, sobrescrevendo 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 a instrução INSERT OVERWRITE INTO de forma assíncrona para importar dados elasticamente. Use a instrução
SUBMIT JOBpara enviar uma tarefa assíncrona para agendamento 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 é o seguinte:
+---------------------------------------+ | job_id | +---------------------------------------+ | 202308151719510210170190********** |
Depois de enviar uma tarefa assíncrona usando
SUBMIT JOB, o resultado indica apenas o envio bem-sucedido da tarefa. Use o ID do job para encerrar a tarefa assíncrona ou consultar o status para determinar se a execução foi concluída com sucesso. 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: os parâmetros de configuração do recurso de importação elástica. Coloque os parâmetros entre colchetes ([ ]) e separe múltiplos parâmetros com barras verticais (|). A tabela a seguir descreve os parâmetros.
Parâmetro
Obrigatório
Descrição
adb.load.resource.group.name
Sim
O nome do grupo de recursos de job que executa o job de importação elástica.
adb.load.job.max.acu
Não
A quantidade máxima de recursos para um job de importação elástica. Unidade: unidades de computação do AnalyticDB (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
Não
O tipo de recurso do driver do 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
Não
O tipo de recurso do executor do 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
Não
A capacidade de disco do executor do 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 é o seguinte:
+---------------------------------------+------------------+ | job_name | is_elastic_load | +---------------------------------------+------------------+ | 20230815171951021017019072*********** | 1 | +---------------------------------------+------------------+Se o valor de
is_elastic_loadfor 1, trata-se de uma tarefa de importação elástica. Se o valor for 0, trata-se de uma importação regular.
-
Edição Data Warehouse
-
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 uma tabela externa não particionada no formato CSV como exemplo.
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 os dados da 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 a importação dos dados da tabela externa do OSS para o AnalyticDB for MySQL antes de executar as 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 SELECTexecutam 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 do AnalyticDB for MySQL por um longo período. Durante esse tempo, problemas de rede podem interromper a conexão e causar falhas na importação. Portanto, para grandes volumes de dados, recomendamos usarSUBMIT JOB INSERT OVERWRITE SELECTpara realizar a importação de forma assíncrona.-
Método 1: Execute a instrução
INSERT INTOpara importar dados. Se uma chave primária for duplicada, a operação de gravação atual é ignorada e os dados não sã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, sobrescrevendo 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 a instrução
INSERT OVERWRITEde forma assíncrona para 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 acelerá-la. 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 é o seguinte:
+---------------------------------------+ | 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 e Data Lakehouse
Para informações sobre a sintaxe de criação de tabelas externas do OSS nas edições 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"
}';
Tipo de tabela externa | Parâmetro | Obrigatório | Descrição |
Tabelas externas nos formatos CSV, Parquet e ORC | ENGINE='OSS' | Sim | O motor da tabela. Defina o valor como OSS. |
endpoint | O Endpoint do bucket do OSS. Atualmente, o AnalyticDB for MySQL pode acessar o OSS apenas por meio de uma rede VPC. Nota Acesse o console do OSS, clique em bucket de destino e visualize o Endpoint na página Overview do bucket. | ||
url | O caminho para o arquivo ou diretório do OSS.
| ||
accessid | O AccessKey ID de uma conta Alibaba Cloud ou de um usuário RAM que tenha permissões de gerenciamento do OSS. Para informações sobre como obter um AccessKey ID, consulte Accounts and permissions. | ||
accesskey | O AccessKey Secret de uma conta Alibaba Cloud ou de um usuário RAM que tenha permissões de gerenciamento do OSS. Para obter um AccessKey Secret, consulte Accounts and permissions. | ||
format | Condicionalmente obrigatório | O formato do arquivo.
| |
maxlinelength | Não | Valor padrão: 32768 (32 KB). Se o arquivo de dados contiver linhas que excedam esse comprimento, aumente este parâmetro. Exemplo: | |
Tabelas externas nos formatos CSV e Text | delimiter|field_delimiter | Sim | O delimitador de coluna do arquivo de dados.
|
Tabelas externas no formato CSV | null_value | Não | 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 interpretar valores
Nota Os exemplos anteriores assumem que | ||
skip_header_line_count | O número de linhas a serem ignoradas a partir do 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, o que indica que nenhuma linha é ignorada. | ||
oss_ignore_quote_and_escape | Se definido como true, o sistema ignora aspas e caracteres de escape nos valores dos campos. O padrão é false. Importante Este parâmetro requer um cluster com versão de kernel 3.1.4.2 ou posterior. | ||
charset | O 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 na instrução
CREATE TABLEpara a tabela externa devem ser idênticos aos nomes das colunas no arquivo Parquet ou ORC, mas não fazem distinção entre maiúsculas e minúsculas. A ordem das colunas também deve ser a mesma.Ao criar uma tabela externa, selecione apenas algumas colunas do arquivo Parquet ou ORC para serem colunas na tabela externa. As colunas não selecionadas não são importadas.
Se a instrução
CREATE TABLEpara a tabela externa incluir uma coluna que não existe no arquivo Parquet ou ORC, as consultas para essa coluna retornam NULL.
AnalyticDB for MySQL pode ler e gravar arquivos TEXT do Hive 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 TEXT do Hive:
O delimitador de coluna padrão para arquivos TEXT do Hive é
\1. Ao usar uma tabela externa do OSS formatada em CSV para ler ou gravar esses arquivos, defina o parâmetrodelimitercom o valor de escape\\1.O valor
NULLpadrão para arquivos TEXT do Hive é\N. Ao usar uma tabela externa do OSS formatada em CSV para ler ou gravar esses arquivos, defina o parâmetronull_valuecom o valor de escape\\\\N.Outros tipos de dados básicos do Hive, como
BOOLEAN, mapeiam diretamente para os tipos de dados do AnalyticDB for MySQL. No entanto, os tiposBINARY,CHAR(n)eVARCHAR(n)mapeiam para o tipo AnalyticDB for MySQLVARCHAR.
Apêndice: Mapeamentos de tipos de dados
Os tipos de dados especificados ao criar uma tabela devem corresponder aos mapeamentos nas tabelas a seguir. Para o tipo
DECIMAL, a precisão também deve corresponder.As tabelas externas Parquet não suportam o tipo
STRUCT. O uso desse tipo causa falha na criação da tabela.As tabelas externas ORC não suportam tipos complexos como
LIST,STRUCTeUNION. O uso desses tipos causa falha na criação da tabela. É possível criar uma tabela externa ORC com uma coluna do tipoMAP, mas as consultas à tabela falharão.
Mapeamento de tipos de dados entre arquivos Parquet e **AnalyticDB for MySQL**
Tipo primitivo do Parquet | Tipo lógico do Parquet | Tipo do AnalyticDB for MySQL |
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**
Tipo ORC | Tipo do AnalyticDB for MySQL |
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**
|
Tipo Paimon |
**Tipo do AnalyticDB for MySQL** |
|
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 compatível |
|
TIMESTAMP |
TIMESTAMP |
|
LocalZonedTIMESTAMP |
TIMESTAMP (ignora informações de fuso horário local) |
|
ARRAY |
ARRAY |
|
MAP |
MAP |
|
ROW |
ROW |