Las tablas externas de OSS permiten transferir datos en bloque entre Object Storage Service (OSS) y AnalyticDB for PostgreSQL, incluso entre distintas cuentas de Alibaba Cloud.
Limitaciones
La instancia de AnalyticDB for PostgreSQL y el bucket de OSS deben encontrarse en la misma región.
Formatos de objeto compatibles
Las tablas externas de OSS admiten los siguientes formatos:
Objetos CSV y TEXT sin compresión
Objetos CSV y TEXT comprimidos con GZIP
Objetos binarios ORC
Para consultar las asignaciones de tipos de datos ORC, consulte la sección "Asignaciones de tipos de datos entre ORC y AnalyticDB for PostgreSQL" de Data type mappings for OSS foreign tables.
Requisitos previos
Antes de empezar, asegúrese de haber creado los siguientes objetos en este orden:
Un servidor de OSS: registra el bucket de OSS como origen de datos de Foreign Data Wrapper (FDW) en AnalyticDB for PostgreSQL. Consulte la sección "Crear un servidor de OSS" de Use OSS foreign tables for data lake analysis.
Una asignación de usuario: vincula un usuario de base de datos con las credenciales AccessKey que autorizan el acceso a OSS. Consulte la sección "Crear una asignación de usuario para el servidor de OSS" de Use OSS foreign tables for data lake analysis.
Una tabla externa de OSS: define el esquema y la ubicación en OSS de los datos. Consulte la sección "Crear una tabla externa de OSS" de Use OSS foreign tables for data lake analysis.
Estos tres objetos forman una cadena: el servidor identifica el bucket de OSS, la asignación de usuario proporciona las credenciales para acceder a él y la tabla externa expone los datos de OSS como una tabla consultable.
Importar datos desde OSS
Los siguientes pasos describen un ejemplo completo para importar un archivo CSV desde OSS hacia una tabla de AnalyticDB for PostgreSQL.
-
Cargue un archivo CSV en OSS. Este ejemplo utiliza un archivo llamado
example.csv. Para los pasos de preparación, consulte la sección "Preparativos" de Use OSS foreign tables for data lake analysis. Para obtener instrucciones sobre la carga, consulte Upload objects.Utilice el mismo formato de codificación para sus objetos de OSS y su base de datos a fin de evitar sobrecargas por conversión. La codificación predeterminada de la base de datos es UTF-8.
Conéctese a una base de datos de AnalyticDB for PostgreSQL. Consulte Client connection.
-
Cree un servidor de OSS.
Parámetro
Descripción
endpointEl endpoint interno del bucket de OSS. Solo se admiten endpoints internos. Consulte la sección "Nube pública de Alibaba Cloud" de Regions and endpoints.
bucketEl nombre del bucket de OSS. El bucket debe estar en la misma región que la instancia de AnalyticDB for PostgreSQL.
CREATE SERVER oss_serv FOREIGN DATA WRAPPER oss_fdw OPTIONS ( endpoint 'oss-cn-********.aliyuncs.com', bucket 'adb-pg' ); -
Cree una asignación de usuario.
Para transferencias de datos entre cuentas, utilice el AccessKey ID y el AccessKey secret de la cuenta de Alibaba Cloud propietaria del bucket de OSS.
CREATE USER MAPPING FOR PUBLIC SERVER oss_serv OPTIONS ( id 'LTAI****************', key 'yourAccessKeySecret' ); -
Cree una tabla externa de OSS llamada
ossexample.CREATE FOREIGN TABLE ossexample ( date text, time text, open float, high float, low float, volume int ) SERVER oss_serv OPTIONS (dir 'oss_adb/', format 'csv'); -
Importe los datos mediante uno de los siguientes métodos. Método 1: INSERT (recomendado para cargar datos en una tabla existente) Cree una tabla local con el mismo esquema que la tabla externa y luego inserte los datos.
CREATE TABLE adbexample ( date text, time text, open float, high float, low float, volume int ) WITH (APPENDONLY=TRUE, ORIENTATION=COLUMN, COMPRESSTYPE=ZSTD, COMPRESSLEVEL=5); INSERT INTO adbexample SELECT * FROM ossexample;Método 2: CREATE TABLE AS (crea la tabla y carga los datos en un solo paso)
CREATE TABLE adbexample AS SELECT * FROM ossexample DISTRIBUTED BY (volume);Todos los nodos de cómputo leen objetos de OSS en paralelo mediante un mecanismo de sondeo. De forma predeterminada, se leen cuatro objetos en paralelo. Para obtener el mejor throughput, establezca el número de objetos paralelos como un múltiplo del total de núcleos de los nodos de cómputo (nodos de cómputo × núcleos por nodo). Consulte la sección "Dividir objetos grandes" de Best practices for performing operations on OSS foreign tables .
Si la importación falla (por ejemplo, debido a una discrepancia en la codificación de archivos o a una incompatibilidad de tipos de datos), compruebe que el esquema de la tabla externa coincida con la estructura del objeto de OSS y que la configuración de codificación sea consistente.
Exportar datos a OSS
-
Cree una tabla externa de OSS que apunte al directorio de salida.
CREATE FOREIGN TABLE foreign_x (i int, j int) SERVER oss_serv OPTIONS (format 'csv', dir 'tt_csv/'); -
Exporte datos desde una tabla local hacia OSS.
INSERT INTO foreign_x SELECT * FROM local_x; Compruebe la exportación navegando al directorio
tt_csv/en su bucket de OSS. Cada nodo de cómputo escribe objetos en paralelo, por lo que verá varios archivos (uno o más por segmento).
Convención de nombres para objetos exportados
Los objetos exportados siguen este formato de nombre:
{tablename | prefix}_{timestamp}_{random_key}_{seg}{segment_id}_{fileno}.{ext}[.gz]
|
Componente |
Descripción |
|
|
|
prefix}` |
Si se especifica |
|
|
La hora en que inició la exportación, en formato |
|
|
|
Un valor de clave aleatorio. |
|
|
|
El identificador del segmento; por ejemplo, |
|
|
|
El número de segmento del objeto, comenzando desde |
|
|
|
El formato del objeto: |
|
|
|
Presente cuando el objeto está comprimido con GZIP. |
Ejemplo: exportación a un objeto CSV comprimido con GZIP mediante el parámetro dir
CREATE FOREIGN TABLE fdw_t_out_1(a int)
SERVER oss_serv
OPTIONS (format 'csv', filetype 'gzip', dir 'test/');
Los objetos exportados se nombran con este formato:
fdw_t_out_1_20200805110207_1718599661_seg-1_0.csv.gz
Ejemplo: exportación a un objeto ORC mediante el parámetro prefix
CREATE FOREIGN TABLE fdw_t_out_2(a int)
SERVER oss_serv
OPTIONS (format 'orc', prefix 'test/my_orc_test');
Los objetos exportados se nombran con este formato:
my_orc_test_20200924153043_1737154096_seg0_0.orc