AnalyticDB for PostgreSQL puede importar datos de Object Storage Service (OSS) en paralelo mediante la función de tablas externas gpossext. Cada nodo de cómputo lee los objetos de OSS de forma simultánea, por lo que este método es mucho más rápido que la inserción fila por fila en cargas masivas de datos.
Esta función solo aplica a instancias de AnalyticDB for PostgreSQL V6.0. Para la versión V7.0, consulte Uso de tablas externas de OSS para importar y exportar datos .
Funcionamiento
La función gpossext amplía AnalyticDB for PostgreSQL con un controlador de protocolo oss://. Después de instalar la extensión oss_ext, se define una tabla externa de lectura que se asigna a los objetos de OSS. Al ejecutar INSERT INTO ... SELECT * FROM, cada nodo de cómputo lee un subconjunto de objetos de OSS en paralelo mediante un mecanismo de sondeo. Posteriormente, redistribuye las filas hacia las particiones de destino correctas.

gpossext lee archivos TEXT y CSV, con o sin compresión GZIP.
La sintaxis para crear y usar tablas externas es la misma que en Greenplum Database, excepto por la sintaxis de los parámetros relacionados con la ubicación.
Requisitos previos
Antes de empezar, compruebe que cuenta con lo siguiente:
Una instancia de AnalyticDB for PostgreSQL V6.0.
Un bucket de OSS en la misma región que su instancia.
Un AccessKey ID y un AccessKey secret con permisos de lectura sobre el bucket.
Los datos de origen ya cargados en OSS como archivos TEXT o CSV (sin comprimir o comprimidos con GZIP).
Importación de datos desde OSS
Paso 1: Instalar la extensión oss_ext
Ejecute la siguiente instrucción en cada base de datos que requiera acceso a OSS:
CREATE EXTENSION IF NOT EXISTS oss_ext;
Paso 2: Distribuir los archivos de origen para lecturas en paralelo
Cada nodo de cómputo utiliza un mecanismo de sondeo para reclamar objetos de OSS. Para obtener el mejor throughput, establezca la cantidad de objetos de OSS como un múltiplo entero del número de nodos de cómputo de su instancia. Por ejemplo, si tiene 4 nodos de cómputo, use 4, 8 o 12 objetos.
Para obtener más información sobre cómo los nodos de cómputo distribuyen el trabajo, consulte Overview of OSS foreign tables.
Paso 3: Crear una tabla externa de lectura
CREATE [READABLE] EXTERNAL TABLE tablename
( columnname datatype [, ...] | LIKE othertable )
LOCATION ('ossprotocol')
FORMAT 'TEXT'
[( [HEADER]
[DELIMITER [AS] 'delimiter' | 'OFF']
[NULL [AS] 'null string']
[ESCAPE [AS] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CSV'
[( [HEADER]
[QUOTE [AS] 'quote']
[DELIMITER [AS] 'delimiter']
[NULL [AS] 'null string']
[FORCE NOT NULL column [, ...]]
[ESCAPE [AS] 'escape']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
[ ENCODING 'encoding' ]
[ [LOG ERRORS [INTO error_table]] SEGMENT REJECT LIMIT count
[ROWS | PERCENT] ]
ossprotocol:
oss://oss_endpoint [prefix=prefix_name|dir=[folder/[folder/]...]/file_name|filepath=[folder/[folder/]...]/file_name]
id=userossid key=userosskey bucket=ossbucket compressiontype=[none|gzip] async=[true|false]
Parámetros obligatorios
|
Parámetro |
Descripción |
|
|
Endpoint de OSS con el formato |
|
|
Su AccessKey ID. Consulte Create an AccessKey pair. |
|
|
Su AccessKey secret. Consulte Create an AccessKey pair. |
|
|
El nombre del bucket de OSS. Cree el bucket antes de ejecutar la importación. |
Parámetros de ruta (mutuamente excluyentes: especifique exactamente uno)
|
Parámetro |
Descripción |
|
|
Prefijo de ruta para los objetos de OSS. Importa todos los objetos cuyas rutas comiencen con dicho prefijo. No admite expresiones regulares. Por ejemplo, |
|
|
Ruta del directorio de OSS. La ruta debe terminar con |
|
|
El nombre del objeto que contiene la ruta del objeto de OSS. Solo para tablas externas de lectura. |
Parámetros opcionales
|
Parámetro |
Valor predeterminado |
Descripción |
|
|
— |
Formato del archivo: |
|
|
— |
Codificación de caracteres de los objetos, como |
|
|
|
Formato de compresión. Valores válidos: |
|
|
|
Nivel de compresión para los archivos escritos en OSS. Valores válidos: del 1 al 9. |
|
|
|
Habilita la importación asíncrona mediante hilos auxiliares. Establezca el valor en |
|
|
|
Tiempo de espera de conexión. |
|
|
|
Tiempo de espera de resolución DNS. |
|
|
|
Tasa mínima de transmisión. Debe configurarse junto con |
|
|
|
Duración máxima durante la cual la tasa de transmisión puede mantenerse por debajo de |
|
|
— |
Omite las filas cuya importación falla y las escribe en |
Paso 4: (Opcional) Comprobar que la tabla externa permite lectura
Antes de ejecutar la importación completa, confirme que la tabla externa puede leer desde OSS:
-- Check a sample of rows
SELECT * FROM <External table> LIMIT 10;
-- Inspect the query plan to confirm parallel reads
EXPLAIN INSERT INTO <Destination table> SELECT * FROM <External table>;
El plan de consulta debe mostrar nodos External Scan ejecutándose en todos los segmentos. Esto confirma que los nodos de cómputo leerán los objetos de OSS en paralelo.
Paso 5: Ejecutar la importación en paralelo
INSERT INTO <Destination table> SELECT * FROM <External table>;
Cada nodo de cómputo lee los objetos de OSS asignados e inserta las filas en la tabla de destino. El nodo de movimiento de redistribución calcula el hash de las filas y las enruta a los nodos de cómputo correctos según la clave de distribución.
Ejemplo
Este ejemplo importa datos bursátiles desde OSS hacia una tabla llamada example.
1. Instale la extensión.
CREATE EXTENSION IF NOT EXISTS oss_ext;
2. Cree la tabla de destino.
CREATE TABLE example
(date text, time text, open float,
high float, low float, volume int)
DISTRIBUTED BY (date);
Para lograr el mejor rendimiento de importación, utilice almacenamiento orientado a columnas con compresión. Por ejemplo, puede especificar la siguiente cláusula: WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576). Para obtener más información, consulte CREATE TABLE.
3. Cree la tabla externa. Elija el parámetro de ruta que coincida con la organización de sus archivos en OSS.
Con prefix (importa todos los objetos cuyo prefijo de ruta coincida; admite GZIP):
CREATE READABLE EXTERNAL TABLE ossexample
(date text, time text, open float, high float,
low float, volume int)
location('oss://oss-cn-hangzhou.aliyuncs.com
prefix=osstest/example id=XXX
key=XXX bucket=testbucket compressiontype=gzip')
FORMAT 'csv' (QUOTE '''' DELIMITER E'\t')
ENCODING 'utf8'
LOG ERRORS SEGMENT REJECT LIMIT 5;
Con dir (importa todos los objetos ubicados directamente en el directorio; no admite GZIP):
CREATE READABLE EXTERNAL TABLE ossexample
(date text, time text, open float, high float,
low float, volume int)
location('oss://oss-cn-hangzhou.aliyuncs.com
dir=osstest/ id=XXX
key=XXX bucket=testbucket')
FORMAT 'csv'
LOG ERRORS SEGMENT REJECT LIMIT 5;
Con filepath (importa el objeto especificado):
CREATE READABLE EXTERNAL TABLE ossexample
(date text, time text, open float, high float,
low float, volume int)
location('oss://oss-cn-hangzhou.aliyuncs.com
filepath=osstest/example.csv id=XXX
key=XXX bucket=testbucket')
FORMAT 'csv'
LOG ERRORS SEGMENT REJECT LIMIT 5;
4. Importe los datos.
INSERT INTO example SELECT * FROM ossexample;
El plan de consulta confirma que los cuatro nodos de cómputo leen desde OSS en paralelo:
EXPLAIN INSERT INTO example SELECT * FROM ossexample;
QUERY PLAN
-------------------------------------------------------------------------------------------------
Insert (slice0; segments: 4) (rows=250000 width=92)
-> Redistribute Motion 4:4 (slice1; segments: 4) (cost=0.00..11000.00 rows=250000 width=92)
Hash Key: ossexample.date
-> External Scan on ossexample (cost=0.00..11000.00 rows=250000 width=92)
(4 rows)
Referencia de formatos TEXT y CSV
A continuación se describen los parámetros que controlan cómo gpossext analiza sintácticamente los archivos TEXT y CSV. Especifíquelos en la cláusula FORMAT de su instrucción CREATE EXTERNAL TABLE.
\n: delimitador de línea (carácter de nueva línea).DELIMITER: separador de columnas. Si se especifica, también debe indicarseQUOTE. Opciones comunes:,,|,\t.QUOTE: envuelve los valores de columna que contienen caracteres especiales. Debe ser distinto deDELIMITER. Valor predeterminado:". Los valores que incluyen caracteresQUOTEtambién deben usarESCAPE.ESCAPE: se coloca antes de cualquier carácter que deba tratarse como literal. Valor predeterminado: el mismo queQUOTE. También suele utilizarse la barra invertida (\).
Todos los caracteres de control deben ser de un solo byte.
Caracteres de control predeterminados
|
Carácter de control |
TEXT |
CSV |
|
DELIMITER |
|
|
|
QUOTE |
|
|
|
ESCAPE |
N/A |
|
|
NULL |
|
Cadena vacía sin comillas |
Solución de problemas
Revisión de errores de importación
Si utilizó LOG ERRORS al crear la tabla externa, recupere las filas con errores mediante la siguiente instrucción:
SELECT * FROM gp_read_error_log('external_table_name');
Para borrar el registro de errores después de revisarlo, ejecute:
SELECT gp_truncate_error_log('external_table_name');
El registro de errores se elimina automáticamente cuando se borra la tabla externa.
Interpretación de los campos de error del SDK
Los errores del SDK de OSS en el registro de importación incluyen los siguientes campos:
|
Campo |
Descripción |
|
|
Código de estado HTTP de la solicitud con errores. |
|
|
Código de error de OSS. |
|
|
Mensaje de error de OSS. |
|
|
UUID de la solicitud con errores. Proporcione este identificador al soporte técnico de Alibaba Cloud cuando reporte problemas persistentes. |
Para obtener detalles sobre los códigos de error de OSS, consulte Respuestas de error.
Corrección de errores de tiempo de espera
Ajuste oss_speed_limit y oss_speed_time de manera conjunta para configurar el comportamiento de los tiempos de espera. Para conocer el manejo general de tiempos de espera en OSS, consulte Manejo de erroresManejo de errores.
Pasos siguientes
Nombres de dominio de OSS: busque el endpoint correcto para su región.
Documentación de OSS: gestione buckets y objetos.
CREATE TABLE: sintaxis completa de las opciones de almacenamiento de tablas.
Respuestas de error: referencia de códigos de error de OSS.
Manejo de erroresManejo de errores: guía para gestionar tiempos de espera y errores.