Use tabelas externas do OSS para importar e analisar dados do Object Storage Service (OSS). Baseadas no wrapper de dados externos do OSS (FDW), essas tabelas também permitem a importação de dados entre contas.
Limitações
A instância do AnalyticDB for PostgreSQL e o bucket do OSS devem estar na mesma região.
Recursos
O OSS FDW baseia-se na estrutura PostgreSQL Foreign Data Wrapper (FDW) e permite:
Importar dados do OSS para tabelas locais orientadas a linhas ou colunas, acelerando a análise.
Consultar e analisar diretamente grandes volumes de dados no OSS.
Combinar tabelas externas do OSS com tabelas locais para análise.
O OSS FDW oferece suporte a vários formatos de arquivo de dados, incluindo:
Arquivos de texto não compactados nos formatos CSV, TEXT, JSON e JSON Lines.
Arquivos de texto compactados com GZIP e Snappy nos formatos CSV e TEXT.
Arquivos de texto compactados com GZIP nos formatos JSON e JSON Lines.
Arquivos binários ORC. Para mapeamentos de tipos de dados entre ORC e AnalyticDB for PostgreSQL, consulte Mapeamentos de tipos de dados para arquivos ORC.
Arquivos binários Parquet. Para mapeamentos de tipos de dados entre Parquet e AnalyticDB for PostgreSQL, consulte Mapeamentos de tipos de dados para arquivos Parquet.
Arquivos binários Avro. Para mapeamentos de tipos de dados entre Avro e AnalyticDB for PostgreSQL, consulte Mapeamentos de tipos de dados para arquivos Avro.
Antes de começar
Prepare os dados do OSS
Prepare o arquivo de exemplo example.csv.
Encontre as informações do bucket do OSS
Esta seção descreve como localizar os campos Buckets, Bucket Name, Port e Bucket Domain Name.
Faça login no console do OSS.
No painel de navegação à esquerda, clique em Access from ECS over the VPC (internal network).
-
Na página Endpoint, clique no bucket desejado.
Na página Object Management, localize o nome do bucket.
Na página Object Management, localize o caminho do objeto.
No painel de navegação à esquerda, clique em Overview.
-
Na seção Port da página Overview, localize o endpoint e o nome de domínio do bucket.
Recomendamos usar o endpoint para Access from ECS over the VPC (internal network).
Obtenha um AccessKey ID e AccessKey Secret
Para obter um AccessKey ID e AccessKey Secret, consulte Criar um AccessKey.
Crie um servidor OSS
Use a instrução CREATE SERVER para criar um servidor OSS. Esse servidor define a conexão com o serviço OSS que você deseja acessar. Para mais informações sobre CREATE SERVER, consulte CREATE SERVER.
Sintaxe
CREATE SERVER server_name
FOREIGN DATA WRAPPER fdw_name
[ OPTIONS ( option 'value' [, ... ] ) ]
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
server_name |
STRING |
Sim |
Nome do servidor OSS. |
|
fdw_name |
STRING |
Sim |
Nome do wrapper de dados externos que gerencia o servidor. Defina este parâmetro como oss_fdw. |
A tabela a seguir descreve os parâmetros da cláusula OPTIONS.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
endpoint |
STRING |
Sim |
Endpoint usado para acessar o OSS. O AnalyticDB for PostgreSQL aceita apenas endpoints internos. Para mais informações, consulte a seção de nuvem pública em Regiões e endpoints. |
|
bucket |
STRING |
Não |
Nome do bucket onde os arquivos de dados estão armazenados. Para detalhes sobre como obter o nome do bucket, consulte Preparações. Nota
|
|
speed_limit |
NUMERIC |
Não |
Quantidade mínima de dados a transferir dentro do período especificado por speed_time para evitar timeout. Unidade: bytes. O valor padrão é 1024. Use esta opção junto com a opção speed_time. Nota
Por padrão, ocorre timeout se menos de 1024 bytes de dados forem transferidos em 90 segundos consecutivos. Para mais informações, consulte Tratamento de Erros do SDK do OSS. |
|
speed_time |
NUMERIC |
Não |
Período de tempo dentro do qual a quantidade mínima de transferência de dados especificada por speed_limit deve ser atendida. Unidade: segundos. O valor padrão é 90. Use esta opção junto com a opção speed_limit. Nota
Por padrão, ocorre timeout se menos de 1024 bytes de dados forem transferidos em 90 segundos consecutivos. Para mais informações, consulte Tratamento de Erros do SDK do OSS. |
|
connect_timeout |
NUMERIC |
Não |
Tempo limite de conexão. Unidade: segundos. O valor padrão é 10. |
|
dns_cache_timeout |
NUMERIC |
Não |
Tempo limite do cache DNS. Unidade: segundos. O valor padrão é 60. |
Exemplos
CREATE SERVER oss_serv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-********.aliyuncs.com',
bucket 'adb-pg'
);
Também é possível usar a instrução ALTER SERVER para modificar a configuração do servidor OSS. Para mais informações, consulte ALTER SERVER.
Exemplos:
-
Modifique uma opção do servidor OSS.
ALTER SERVER oss_serv OPTIONS(SET endpoint 'oss-cn-********.aliyuncs.com'); -
Adicione uma opção ao servidor OSS.
ALTER SERVER oss_serv OPTIONS(ADD connect_timeout '20'); -
Remova uma opção do servidor OSS.
ALTER SERVER oss_serv OPTIONS(DROP connect_timeout);
Para excluir o servidor OSS, use a instrução DROP SERVER. Para mais informações, consulte DROP SERVER.
Crie um mapeamento de usuário do OSS
Após criar um servidor OSS, crie também um mapeamento de usuário. A instrução CREATE USER MAPPING define um mapeamento entre um usuário no banco de dados AnalyticDB for PostgreSQL e as credenciais para acessar o servidor OSS. Para mais informações, consulte CREATE USER MAPPING.
Sintaxe
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER <server_name>
[ OPTIONS ( option 'value' [, ... ] ) ]
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
username |
string |
Sim. Especifique uma das quatro opções. |
Nome de um usuário existente a ser mapeado na instância AnalyticDB for PostgreSQL. |
|
USER |
string |
Mapeia o usuário atual da instância AnalyticDB for PostgreSQL. |
|
|
CURRENT_USER |
string |
||
|
PUBLIC |
string |
Cria um mapeamento público aplicável a todos os usuários da instância AnalyticDB for PostgreSQL, incluindo aqueles criados posteriormente. |
|
|
server_name |
string |
Sim |
Nome do servidor OSS. |
A tabela a seguir descreve os parâmetros da cláusula OPTIONS.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
id |
string |
Sim |
AccessKey ID. Para obter um, consulte Criar um par de AccessKey. |
|
key |
string |
Sim |
AccessKey Secret. Para obter um, consulte Criar um par de AccessKey. |
Ao importar ou exportar dados entre contas da Alibaba Cloud, configure o AccessKey ID e o AccessKey Secret da conta proprietária do bucket do OSS.
Exemplo
CREATE USER MAPPING FOR PUBLIC
SERVER oss_serv
OPTIONS (
id 'LTAI****************',
key 'yourAccessKeySecret'
);
Também é possível usar a instrução DROP USER MAPPING para excluir um mapeamento de usuário. Para mais informações, consulte DROP USER MAPPING.
Crie uma tabela externa do OSS
Depois de configurar um servidor OSS e um usuário com acesso a ele, use a instrução CREATE FOREIGN TABLE para criar uma tabela externa do OSS. Para mais informações, consulte CREATE FOREIGN TABLE.
Sintaxe
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
[, ... ]
] )
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
table_name |
string |
Sim |
Nome da tabela externa do OSS. |
|
column_name |
string |
Sim |
Nome da coluna. |
|
data_type |
string |
Sim |
Tipo de dados da coluna. |
A tabela a seguir lista os parâmetros da cláusula OPTIONS.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
filepath |
string |
Sim. Um destes três parâmetros é obrigatório. |
Caminho completo e nome de um único objeto no OSS. Se você usar este parâmetro, apenas o objeto especificado será selecionado. |
|
prefix |
string |
Prefixo para os caminhos dos objetos. Apenas objetos cujos caminhos começam com este prefixo são selecionados. Não há suporte a expressões regulares. Exemplos:
|
|
|
dir |
string |
O caminho do diretório no OSS deve terminar com /, por exemplo, test/mydir/. Seleciona todos os objetos no diretório especificado, excluindo objetos em seus subdiretórios. |
|
|
bucket |
string |
Não |
Nome do bucket que contém os objetos de dados. Consulte Preparações para saber como obter o nome do bucket. Nota
|
|
format |
string |
Sim |
Formato do objeto. Valores válidos:
|
|
filetype |
string |
Não |
Tipo de compactação do objeto. Valores válidos:
Nota
|
|
log_errors |
boolean |
Não |
Define se os erros devem ser registrados em um arquivo de log. O valor padrão é Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
segment_reject_limit |
numeric |
Não |
Limiar de erro que causa a interrupção da tarefa de carregamento de dados. Se o valor incluir um sinal de porcentagem (
Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
header |
boolean |
Não |
Define se o objeto de source contém uma linha de cabeçalho. Valores válidos:
Nota
Este parâmetro aplica-se apenas a objetos no formato csv. |
|
delimiter |
string |
Não |
Delimitador que separa os campos. Deve ser um caractere de byte único.
Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
quote |
string |
Não |
Caractere de citação para campos. Deve ser um caractere de byte único. O padrão é aspas duplas ( Nota
Este parâmetro aplica-se apenas a objetos no formato csv. |
|
escape |
string |
Não |
Caractere de escape que precede um caractere com significado especial. Deve ser um caractere de byte único. O padrão é aspas duplas ( Nota
Este parâmetro aplica-se apenas a objetos no formato csv. |
|
null |
string |
Não |
String que representa um valor NULL no objeto de dados.
Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
encoding |
string |
Não |
Codificação dos objetos de dados. O padrão é a codificação do cliente. Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
force_not_null |
boolean |
Não |
Define se os valores dos campos podem ser strings vazias. Valores válidos:
Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
|
force_null |
boolean |
Não |
Define como lidar com strings vazias. Valores válidos:
Nota
Este parâmetro aplica-se apenas a objetos nos formatos csv e text. |
Exemplo
CREATE FOREIGN TABLE ossexample (
date text,
time text,
open float,
high float,
low float,
volume int
) SERVER oss_serv OPTIONS (dir 'dir_oss_adb/', format 'csv');
Após criar uma tabela externa do OSS, use um dos seguintes métodos para verificar a quais objetos do OSS a tabela está mapeada:
-
Método 1:
EXPLAIN VERBOSE SELECT * FROM <OSS foreign table name>; -
Método 2:
SELECT * FROM get_oss_table_meta('<OSS foreign table name>');
Também é possível usar a instrução DROP FOREIGN TABLE para remover a tabela externa do OSS. Para mais informações, consulte DROP FOREIGN TABLE.
Consulte e analise dados do OSS
Consulte uma tabela externa do OSS da mesma forma que consulta uma tabela local. Os exemplos a seguir mostram consultas comuns.
-
Consulte dados usando um filtro de chave-valor.
SELECT * FROM ossexample WHERE volume = 5; -
Consulte dados usando uma função de agregação.
SELECT count(*) FROM ossexample WHERE volume = 5; -
Consulte dados usando as cláusulas GROUP BY e LIMIT.
SELECT low, sum(volume) FROM ossexample GROUP BY low ORDER BY low limit 5;
Análise de junção com tabelas externas do OSS
-
Crie uma tabela local chamada example e insira dados de teste.
CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5); -
Execute uma consulta de junção nas tabelas example e ossexample.
SELECT example.volume, min(high), max(low) FROM ossexample, example WHERE ossexample.volume = example.volume GROUP BY(example.volume) ORDER BY example.volume;
Tolerância a falhas
O OSS FDW fornece tolerância a falhas usando os parâmetros log_errors e segment_reject_limit. Isso evita que erros nos dados brutos interrompam as varreduras de uma tabela externa do OSS.
Para mais informações sobre os parâmetros log_errors e segment_reject_limit, consulte Criar uma tabela externa do OSS.
-
Crie uma tabela externa do OSS com tolerância a falhas.
CREATE FOREIGN TABLE oss_error_sales (id int, value float8, x text) SERVER oss_serv OPTIONS (log_errors 'true', -- Enable error logging. segment_reject_limit '10', -- Set the reject limit to 10 rows. The scan is aborted if this limit is exceeded. dir 'error_sales/', -- Specify the OSS object directory for the foreign table. format 'csv', -- Specify the object format as CSV. encoding 'utf8'); -- Specify the encoding. -
Consulte o log de erros.
SELECT * FROM gp_read_error_log('oss_error_sales'); -
Limpe o log de erros.
SELECT gp_truncate_error_log('oss_error_sales');
Perguntas frequentes
P: Excluir dados de uma tabela externa do OSS também exclui os dados subjacentes no OSS?
R: Não. Excluir dados de uma tabela externa do OSS não exclui os dados subjacentes no OSS.