A partir da versão V4.1 do Hologres, a função EXTERNAL_FILES permite consultar, importar e exportar diretamente arquivos de dados estruturados armazenados no Object Storage Service (OSS) sem criar tabelas externas. Este tópico descreve pré-requisitos, sintaxe, parâmetros, exemplos e limitações.
Visão geral
O recurso EXTERNAL_FILES permite executar consultas SQL diretamente em arquivos CSV, Parquet e ORC no OSS sem exigir tabelas externas. Utilize-o nos três cenários a seguir:
Consulta de dados: Execute instruções SELECT em arquivos CSV, Parquet e ORC armazenados no OSS.
Importação de dados: Carregue dados de arquivos do OSS para uma tabela interna do Hologres.
Exportação de dados: Grave dados de uma tabela do Hologres no OSS como arquivos CSV.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do Hologres na versão V4.1 ou posterior. Para atualizar, consulte Instance upgrades.
Uma conta Alibaba Cloud ou um usuário RAM. Não há suporte para contas personalizadas.
Configuração de permissões
O EXTERNAL_FILES acessa o OSS por meio de uma função RAM. Conclua as etapas a seguir antes de executar o EXTERNAL_FILES.
Etapa 1: Criar uma função RAM
Faça login no console RAM e acesse RAM Roles.
Clique em Create Role.
Na caixa de diálogo, defina Trusted Entity Type como Cloud Service e Trusted Entity como Real-time Data Warehouse Hologres.
Insira um nome para a função e conclua a criação.
Etapa 2: Conceder permissões do OSS à função
Anexe uma política do OSS à função RAM conforme as operações necessárias:
Leitura de dados: Anexe
AliyunOSSReadOnlyAccess.Gravação de dados: Anexe
AliyunOSSFullAccess.
Etapa 3: Conceder a permissão GrantAssumeRole aos usuários RAM
Ignore esta etapa se o usuário que executa o SQL for uma conta Alibaba Cloud. Para usuários RAM, conceda a permissão GrantAssumeRole da seguinte forma:
No console RAM, acesse Policies e clique em Create Policy.
-
Mude para Script Editor e cole o JSON a seguir. Substitua
<RoleARN>pelo ARN da função criada. Para localizar o ARN, consulte FAQ about RAM roles and STS tokens.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "hologram:GrantAssumeRole", "Resource": "<RoleARN>" } ] } -
Anexe esta política ao usuário:
Para um usuário RAM: acesse Users > Permissions > Add Permissions.
Para uma função RAM: acesse Roles > Permissions > Add Permissions.
Sintaxe
Consultar dados
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
Importar dados
INSERT INTO target_table
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
Exportar dados
INSERT INTO EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) SELECT * FROM source_table;
Parâmetros
Parâmetros comuns
|
Parâmetro |
Tipo |
Descrição |
Obrigatório |
Padrão |
Exemplo |
|
|
STRING |
Caminho do arquivo no OSS. Aceita diretórios, arquivos individuais e múltiplos caminhos separados por vírgula. Suporta curingas — veja a tabela abaixo. |
Sim |
— |
|
|
|
STRING |
Formato do arquivo. Formatos com suporte para consulta: |
Sim |
— |
|
|
|
STRING |
Endpoint de rede clássica do OSS. Para valores de endpoint, consulte Regions and endpoints. |
Não |
— |
|
|
|
STRING |
ARN da função RAM usada para acessar o OSS. |
Não |
— |
|
Curingas com suporte em path
|
Curinga |
Descrição |
Exemplo |
|
|
Corresponde a zero ou mais caracteres |
|
|
|
Corresponde a qualquer caractere único |
|
Parâmetros de leitura
|
Parâmetro |
Tipo |
Descrição |
Obrigatório |
Padrão |
|
|
INT |
Quantidade máxima de arquivos a verificar durante a inferência de schema. |
Não |
|
|
|
STRING |
Ordem de verificação dos arquivos para inferência de schema. Valores válidos: |
Não |
|
|
|
BOOLEAN |
Define se a primeira linha de um arquivo CSV deve ser tratada como cabeçalho e ignorada na leitura. |
Não |
|
|
|
STRING |
Delimitador de colunas para arquivos CSV. |
Não |
|
Parâmetros de gravação
|
Parâmetro |
Tipo |
Descrição |
Obrigatório |
Padrão |
|
|
INT |
Tamanho alvo de cada arquivo de saída, em MB. |
Não |
|
|
|
BOOLEAN |
Determina se todos os dados exportados devem ser gravados em um único arquivo. |
Não |
|
Exemplos
Consultar um arquivo CSV
Consulte um arquivo CSV com inferência automática de schema:
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
csv_delimiter = ',',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Consulte um arquivo CSV com schema especificado manualmente:
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (id int, name text, amount decimal(10,2));
Consultar um arquivo Parquet
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/parquet_data/',
format = 'parquet',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Consultar um arquivo ORC
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orc_data/',
format = 'orc',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Importar dados para uma tabela do Hologres
-- Create the target table
CREATE TABLE orders (
order_id int,
customer_name text,
amount decimal(10,2),
PRIMARY KEY(order_id)
);
-- Import data from OSS
INSERT INTO orders
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orders/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (order_id int, customer_name text, amount decimal(10,2));
Exportar dados para o OSS
Exporte para múltiplos arquivos com limite de tamanho por arquivo:
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
target_file_size_mb = '100'
) SELECT * FROM orders;
Exporte todos os dados para um único arquivo:
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
single_file = 'true'
) SELECT * FROM orders;
Usar um grupo de recursos serverless
SET hg_computing_resource = 'serverless';
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
Inferência de schema
Inferência automática
Se você omitir a cláusula AS, o Hologres infere o schema automaticamente:
Parquet e ORC: O schema é inferido a partir dos metadados do arquivo.
CSV com linha de cabeçalho: A inferência utiliza o cabeçalho e o conteúdo dos dados. Defina
csv_skip_header = 'true'para evitar que a linha de cabeçalho seja lida como dado.CSV sem linha de cabeçalho: Todos os arquivos no caminho devem ter estruturas de colunas idênticas.
O Hologres verifica até schema_deduce_file_num arquivos (padrão: 5) e une todos os schemas encontrados.
Comportamento em caso de divergência de schema
Quando o schema inferido ou especificado não corresponde exatamente ao conteúdo do arquivo, o Hologres trata as divergências da seguinte maneira:
|
Cenário |
Comportamento |
|
Coluna existe no schema, mas não no arquivo |
Preenchida com NULL |
|
Coluna existe no arquivo, mas não no schema |
Ignorada |
|
Tipos de coluna diferentes, porém conversíveis |
Conversão automática de tipo |
|
Tipos de coluna diferentes e não conversíveis |
Retorna NULL |
Exemplo: consulta de arquivos com colunas divergentes
Considere dois arquivos CSV no mesmo caminho:
orders_jan.csv — 3 colunas: order_id, customer_name, amount
orders_feb.csv — 4 colunas: order_id, customer_name, amount, region
Ao consultar o caminho sem especificar um schema, o Hologres une ambos os schemas. As linhas de orders_jan.csv retornam NULL na coluna region:
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orders/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
|
order_id |
customer_name |
amount |
region |
|
1001 |
Alice |
99,00 |
NULL |
|
1002 |
Bob |
149,00 |
NULL |
|
2001 |
Carol |
79,00 |
us-west |
|
2002 |
Dave |
199,00 |
eu-central |
Para evitar valores NULL inesperados, especifique o schema explicitamente usando a cláusula AS ou garanta que todos os arquivos compartilhem a mesma estrutura de colunas.
Mapeamento de tipos
Mapeamento de tipos ORC
|
Tipo ORC |
Tipo PostgreSQL |
|
BOOLEAN |
BOOLEAN |
|
TINYINT / SMALLINT |
SMALLINT |
|
INT |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
REAL |
|
DOUBLE |
DOUBLE PRECISION |
|
DECIMAL(p, s) |
DECIMAL(p, s) |
|
STRING |
TEXT |
|
VARCHAR(n) |
VARCHAR(n) |
|
CHAR(n) |
CHAR(n) |
|
BINARY |
BYTEA |
|
DATE |
DATE |
|
TIMESTAMP |
TIMESTAMP WITHOUT TIME ZONE |
|
TIMESTAMP WITH LOCAL TIMEZONE |
TIMESTAMP WITH TIME ZONE |
|
LIST |
Array (pg_type[]) |
Os tipos ORCUNION,STRUCTeMAPnão têm suporte.
Mapeamento de tipos Parquet
|
Tipo físico Parquet |
Tipo lógico Parquet |
Tipo PostgreSQL |
|
BOOLEAN |
— |
BOOLEAN |
|
INT32 |
— |
INTEGER |
|
INT32 |
DATE |
DATE |
|
INT32 |
DECIMAL(p, s) |
DECIMAL(p, s) |
|
INT64 |
— |
BIGINT |
|
INT64 |
TIMESTAMP_MILLIS / MICROS |
TIMESTAMP / TIMESTAMPTZ |
|
INT64 |
DECIMAL(p, s) |
DECIMAL(p, s) |
|
FLOAT |
— |
REAL |
|
DOUBLE |
— |
DOUBLE PRECISION |
|
BYTE_ARRAY |
— |
BYTEA |
|
BYTE_ARRAY |
STRING |
TEXT |
|
BYTE_ARRAY |
JSON / BSON |
JSONB |
|
BYTE_ARRAY |
ENUM |
TEXT |
|
FIXED_LEN_BYTE_ARRAY |
DECIMAL(p, s) |
DECIMAL(p, s) |
|
FIXED_LEN_BYTE_ARRAY |
UUID |
UUID |
|
LIST |
LIST |
Array (pg_type[]) |
Os tipos ParquetSTRUCTeMAPnão têm suporte.
Limitações
Formato de exportação: Apenas CSV tem suporte para exportações.
Busca recursiva em diretórios: Subdiretórios não são pesquisados recursivamente. Use curingas no parâmetro
pathpara corresponder a arquivos em um diretório plano.Tipos ORC sem suporte:
UNION,STRUCTeMAP.Tipos Parquet sem suporte:
STRUCTeMAP.Contas com suporte: Apenas usuários RAM e contas Alibaba Cloud. Não há suporte para contas personalizadas.
Perguntas frequentes
Recebi um erro de permissão ao exportar dados. O que fazer?
Verifique se a função RAM tem a permissão AliyunOSSFullAccess. Operações de leitura exigem apenas AliyunOSSReadOnlyAccess, mas operações de gravação (exportações) requerem acesso total.
Como controlar a quantidade e o tamanho dos arquivos exportados?
Use target_file_size_mb para definir o tamanho alvo de cada arquivo de saída (padrão: 10 MB). Para um controle mais granular sobre o número de linhas por arquivo, ajuste o parâmetro hg_experimental_query_batch_size.