Utilice COPY FROM STDIN para cargar datos en Hologres y COPY TO STDOUT para exportarlos. Hologres amplía la sintaxis estándar de PostgreSQL COPY con dos parámetros específicos: STREAM_MODE (modo de copia fijo) y ON_CONFLICT (política ante conflictos de clave primaria).
Todas las instrucciones COPY se deben ejecutar en un cliente de PostgreSQL. Para conocer los detalles de conexión, consulte PostgreSQL client.
Para supervisar las operaciones COPY, consulte hologres.hg_query_log. En Hologres V3.0 y versiones posteriores, cada operación genera dos registros: uno para el comando COPY y otro para la instrucción INSERT subyacente. Ambos se vinculan mediante el identificador de transacción. Consulte Registro de consultas para obtener más información.
Limitaciones
COPY FROMescribe únicamente en tablas particionadas secundarias, no en las tablas primarias.COPY FROM STDINes compatible con tablas que tienen una restricción DEFAULT o columnas SERIAL a partir de Hologres V1.1.43. Las versiones anteriores no admiten estos tipos de tabla.
Sintaxis
/* Import data */
COPY table_name [ ( column_name [, ...] ) ]
FROM STDIN
[ [ WITH ] ( option [, ...] ) ]
/* Export data */
COPY { ( query ) }
TO STDOUT
[ [ WITH ] ( option [, ...] ) ]
El option puede ser uno de los siguientes:
FORMAT format_name -- TEXT (default), CSV, or BINARY
DELIMITER 'delimiter_character'
NULL 'null_string'
HEADER [ boolean ] -- CSV only
QUOTE 'quote_character' -- CSV only
ESCAPE 'escape_character' -- CSV only
FORCE_QUOTE { ( column_name [, ...] ) | * } -- CSV, COPY TO only
FORCE_NOT_NULL ( column_name [, ...] ) -- CSV, COPY FROM only
ENCODING 'encoding_name'
STREAM_MODE [ boolean ] -- Hologres-specific; COPY FROM only
ON_CONFLICT 'none|ignore|update' -- Hologres-specific; COPY FROM only
Parámetros
|
Parámetro |
Descripción |
|
|
Tabla de Hologres donde se importarán los datos. |
|
|
Instrucción SELECT cuyos resultados se exportan. |
|
|
Lee la entrada desde la entrada estándar del cliente. |
|
|
Escribe la salida en la salida estándar del cliente. |
|
|
Formato del archivo: |
|
|
Separador de columnas. Valor predeterminado: tabulación ( |
|
|
Cadena que representa un valor nulo. Valor predeterminado: |
|
|
Indica si el archivo incluye una fila de encabezado. Solo para CSV. |
|
|
Carácter de un byte que delimita los valores de campo. Solo para CSV. Valor predeterminado: |
|
|
Carácter de un byte que precede a una coincidencia de |
|
|
Fuerza el uso de comillas en todos los valores distintos de NULL de las columnas especificadas. Solo para CSV y |
|
|
Trata las cadenas que representan valores nulos como cadenas de longitud cero en lugar de NULL. Solo para CSV y |
|
|
Codificación del archivo. Valor predeterminado: la codificación del cliente. |
|
|
Habilita el modo de copia fijo para las importaciones. Valor predeterminado: |
|
|
Política aplicada cuando ocurre una colisión de clave primaria. Los valores no distinguen entre mayúsculas y minúsculas si se escriben sin comillas; si se usan comillas simples, escríbalos en minúsculas (por ejemplo, |
Valores de ON_CONFLICT:
|
Valor |
Comportamiento |
Cuándo utilizarlo |
|
|
Reporta un error cuando hay conflicto. |
Integridad estricta de datos: cada fila debe ser nueva. |
|
|
Omite la fila en conflicto. |
Cargas idempotentes donde se esperan duplicados y se debe conservar el registro existente. |
|
|
Sobrescribe la fila en conflicto. |
Patrones upsert en los que prevalece el valor más reciente. |
Comportamiento de ON_CONFLICT por versión
Antes de V3.0.4:
ON_CONFLICTsurte efecto únicamente cuandoSTREAM_MODE TRUE.V3.0.4 y posteriores:
ON_CONFLICTtambién surte efecto cuandoSTREAM_MODE FALSE, siempre que el parámetro GUChg_experimental_copy_enable_on_conflictesté habilitado. ConSTREAM_MODE FALSE,UPDATErequiere escribir todas las columnas.V3.1.1 y posteriores: cuando
STREAM_MODE FALSE,UPDATEadmite importaciones de columnas parciales (hg_experimental_copy_enable_on_conflictestá habilitado de forma predeterminada).
Atomicidad
El comando COPY estándar (STREAM_MODE FALSE) garantiza la atomicidad: toda la operación se completa con éxito o se revierte.
El modo de copia fijo (STREAM_MODE TRUE) usa un bloqueo a nivel de fila en lugar de uno a nivel de tabla, por lo que no garantiza la atomicidad. Si una fila contiene datos no válidos, se reporta un error solo para esa fila. Las filas restantes podrían escribirse de forma parcial o no escribirse en absoluto.
Registro de consultas
En Hologres V3.0 y versiones posteriores, cada operación COPY genera dos registros en hologres.hg_query_log: uno para el comando COPY y otro para la instrucción INSERT que se ejecuta internamente. Vincúlelos mediante el identificador de transacción:
SELECT
query_id,
query,
extended_info
FROM
hologres.hg_query_log
WHERE
extended_info ->> 'source_trx' = '<transaction_id>' -- Get the transaction ID from the trans_id field in the COPY log record
ORDER BY
query_start;
En versiones anteriores a V3.0, cada operación COPY genera un único registro.
Importar datos a Hologres
Importar desde un cliente de PostgreSQL (stdin)
El cliente de PostgreSQL solo puede leer desde stdin. La consola HoloWeb no admite importaciones desde stdin.
Ejemplo 1: importar texto delimitado
-- Create the target table
CREATE TABLE copy_test (
id int,
age int,
name text
);
-- Import data from stdin
COPY copy_test FROM STDIN WITH DELIMITER AS ',' NULL AS '';
53444,24,wangming
55444,38,ligang
55444,38,luyong
\.
-- Verify
SELECT * FROM copy_test;
Ejemplo 2: importar un archivo CSV
-- Create the target table
CREATE TABLE partsupp (
ps_partkey integer NOT NULL,
ps_suppkey integer NOT NULL,
ps_availqty integer NOT NULL,
ps_supplycost float NOT NULL,
ps_comment text NOT NULL
);
-- Import CSV from stdin
COPY partsupp FROM STDIN WITH DELIMITER '|' CSV;
1|2|3325|771.64|final theodolites
1|25002|8076|993.49|ven ideas
\.
-- Verify
SELECT * FROM partsupp;
Ejemplo 3: importar un archivo local con psql
Redirija un archivo local hacia stdin mediante el operador de redirección del shell de psql:
psql -U <username> -p <port> -h <endpoint> -d <databasename> \
-c "COPY <table> FROM STDIN WITH DELIMITER '|' CSV;" <<filename>;
|
Parámetro |
Descripción |
Ejemplo |
|
|
Cuenta de Alibaba Cloud: AccessKey ID. Cuenta personalizada: nombre de usuario (por ejemplo, |
— |
|
|
Puerto público de la instancia de Hologres. |
|
|
|
Endpoint público de la instancia de Hologres. |
|
|
|
Nombre de la base de datos de Hologres. |
|
|
|
Nombre de la tabla de destino. |
— |
|
|
Ruta del archivo local. |
|
A continuación se muestra un ejemplo que importa el archivo local copy_test mediante este comando:

El archivo contiene lo siguiente:
01,01,name1
02,01,name2
03,01,name3
04,01,name4
Una vez finalizada la importación, consulte los resultados en psql:

Importar desde un cliente JDBC con CopyManager
Los clientes Java Database Connectivity (JDBC) pueden usar CopyManager para transmitir archivos hacia Hologres. Esta clase es el contenedor API del controlador JDBC de PostgreSQL para el comando COPY.
package com.aliyun.hologram.test.jdbc;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
public class jdbcCopyFile {
public static void main(String args[]) throws Exception {
System.out.println(copyFromFile(getConnection(), "/Users/feng/Workspace/region.tbl", "region"));
}
public static Connection getConnection() throws Exception {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://endpoint:port/dbname";
Properties props = new Properties();
// Store credentials in environment variables to avoid hardcoding them
props.setProperty("user", "AAA"); // AccessKey ID
props.setProperty("password", "BBB"); // AccessKey secret
return DriverManager.getConnection(url, props);
}
/**
* Streams a local file into Hologres via COPY FROM STDIN.
*
* @param connection Active JDBC connection
* @param filePath Path to the local file
* @param tableName Target Hologres table
* @return Number of rows imported
*/
public static long copyFromFile(Connection connection, String filePath, String tableName)
throws SQLException, IOException {
long count = 0;
FileInputStream fileInputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection) connection);
fileInputStream = new FileInputStream(filePath);
count = copyManager.copyIn("COPY " + tableName + " FROM STDIN delimiter '|' csv", fileInputStream);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return count;
}
}
Modo de copia fijo
El modo de copia fijo (STREAM_MODE TRUE) utiliza planes de ejecución fijos precompilados para acelerar las importaciones repetidas con COPY. Se trata de una optimización específica de Hologres, disponible desde la versión V1.3.17, que aplica exclusivamente a las importaciones. Para comparar este método con otros modos de escritura por lotes, consulte Comparison of batch write modes. Para conocer el mecanismo subyacente, consulte Accelerate SQL execution with fixed plan.
Escritura en un subconjunto de columnas: actualización parcial
Cuando se configura ON_CONFLICT UPDATE y el comando COPY escribe solo en algunas columnas, las columnas excluidas de la lista no se modifican:
CREATE TABLE t0 (id int NOT NULL, name text, age int, primary key(id));
COPY t0(id, name) FROM STDIN
WITH (
STREAM_MODE TRUE,
ON_CONFLICT UPDATE
);
-- Equivalent INSERT INTO statement:
INSERT INTO t0(id, name) VALUES(?, ?)
ON CONFLICT(id) DO UPDATE SET
id = excluded.id, name = excluded.name;
Escritura en un subconjunto de columnas: columnas con valores predeterminados
Si una columna fuera de la lista de COPY tiene un valor DEFAULT, Hologres aplica dicho valor solo a las filas nuevas. Las filas existentes que coincidan por clave primaria no se actualizan en esa columna:
CREATE TABLE t0 (id int NOT NULL, name text, age int DEFAULT 0, primary key(id));
COPY t0(id, name) FROM STDIN
WITH (
STREAM_MODE TRUE,
ON_CONFLICT UPDATE
);
-- Equivalent INSERT INTO statement:
-- For a new row (no matching id), age is set to its default value.
-- For an existing row (matching id), age is not updated.
INSERT INTO t0(id, name, age) VALUES(?, ?, DEFAULT)
ON CONFLICT(id) DO UPDATE SET
id = excluded.id, name = excluded.name;
Exportar datos desde Hologres
Exportar a un archivo local
Los dos métodos descritos a continuación están disponibles únicamente en el cliente de PostgreSQL.
Con el metacomando \copy (psql)
-- Create and populate a table
CREATE TABLE copy_to_local (
id int,
age int,
name text
);
INSERT INTO copy_to_local VALUES
(1, 1, 'a'),
(1, 2, 'b'),
(1, 3, 'c'),
(1, 4, 'd');
-- Export to a local file
\COPY (SELECT * FROM copy_to_local) TO '/root/localfile.txt';
Mediante la redirección de stdout (psql)
psql -U <username> -p <port> -h <endpoint> -d <databasename> \
-c "COPY (SELECT * FROM <tablename>) TO STDOUT WITH DELIMITER '|' CSV;" > <filename>
Exportar a Object Storage Service (OSS)
Utilice el programa hg_dump_to_oss junto con COPY TO PROGRAM para exportar datos de Hologres a un bucket de OSS. Cada exportación tiene un límite de 5 GB.
Requisitos previos
Solo los superusuarios y los usuarios con el rol pg_execute_server_program pueden ejecutar hg_dump_to_oss. Otorgue el rol de la siguiente manera:
-- Simple permission model (SPM)
CALL spm_grant('pg_execute_server_program', '<Alibaba Cloud account ID, email address, or RAM user account>');
-- Standard PostgreSQL authorization model
GRANT pg_execute_server_program TO <account>;
Sintaxis
COPY (query) TO PROGRAM 'hg_dump_to_oss
--AccessKeyId <access_key_id>
--AccessKeySecret <access_key_secret>
--Endpoint <oss_classic_network_endpoint>
--BucketName <bucket_name>
--DirName <directory>
[--FileName <file_name>]
[--BatchSize <n>]'
(DELIMITER ',', HEADER true, FORMAT CSV);
DirName no puede comenzar con / ni con \.
Parámetros
|
Parámetro |
Descripción |
Ejemplo |
|
|
|
Instrucción SELECT cuyos resultados se exportan. |
|
|
|
|
AccessKey ID. Almacénelo en una variable de entorno para evitar exponer las credenciales. |
— |
|
|
|
Secreto del AccessKey. Almacénelo en una variable de entorno. |
— |
|
|
|
Endpoint de red clásica del bucket de OSS. Utilice el endpoint de red clásica, no el público ni el de VPC. Encuéntrelo en la página de detalles del bucket o en Regions and OSS endpoints. |
|
|
|
|
Nombre del bucket de OSS. |
|
|
|
|
Ruta del directorio en OSS. No puede comenzar con |
|
|
|
|
(Opcional) Nombre del archivo de salida. No puede contener los siguientes caracteres: `` ; # ' |
? ~ < ( ) " $ \ { } [ ] & * \n \r ``. |
|
|
|
Número de filas procesadas por lote. Valor predeterminado: |
|
|
|
|
Separador de campos en el archivo de salida. Valor predeterminado: tabulación ( |
|
Ejemplos
-- Export from a Hologres internal table to OSS
COPY (SELECT * FROM holo_test LIMIT 2)
TO PROGRAM 'hg_dump_to_oss
--AccessKeyId <access_id>
--AccessKeySecret <access_key>
--Endpoint oss-cn-hangzhou-internal.aliyuncs.com
--BucketName hologres-demo
--DirName holotest/
--FileName file_name
--BatchSize 3000'
DELIMITER ',';
-- Export from a Hologres foreign table to OSS
COPY (SELECT * FROM foreign_holo_test LIMIT 20)
TO PROGRAM 'hg_dump_to_oss
--AccessKeyId <access_id>
--AccessKeySecret <access_key>
--Endpoint oss-cn-hangzhou-internal.aliyuncs.com
--BucketName hologres-demo
--DirName holotest/
--FileName file_name
--BatchSize 3000'
(DELIMITER ',', HEADER true);
-- Export to an OSS bucket in a different region
-- (e.g., from a Hologres instance in China (Hangzhou) to an OSS bucket in China (Beijing))
COPY (SELECT * FROM holo_test_1 LIMIT 20)
TO PROGRAM 'hg_dump_to_oss
--AccessKeyId <access_id>
--AccessKeySecret <access_key>
--Endpoint oss-cn-beijing-internal.aliyuncs.com
--BucketName hologres-demo
--DirName holotest/
--FileName file_name
--BatchSize 3000'
(DELIMITER ',', HEADER true, FORMAT CSV);
Solución de problemas
|
Error |
Causa |
Solución |
|
|
El parámetro |
Corrija la sintaxis de la consulta. |
|
|
El endpoint de OSS utiliza un tipo de red incorrecto. |
Utilice el endpoint de red clásica del bucket de OSS. |
|
|
El argumento |
Corrija el nombre del programa. |
|
|
El valor de |
Utilice un AccessKey ID válido. |
|
|
El valor de |
Utilice el secreto de AccessKey correcto. |
|
|
El valor de |
Utilice el endpoint de red clásica del bucket de OSS. |
|
|
El valor de |
Compruebe el nombre del bucket. |
|
|
Falta un parámetro obligatorio. |
Compruebe que se hayan especificado todos los parámetros obligatorios. |
|
|
La instancia de Hologres no puede alcanzar la red de OSS. |
Cambie al endpoint de red clásica. Para conocer los detalles de los endpoints, consulte OSS regions and endpoints. |
Exportar desde un cliente JDBC con CopyManager
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class copy_to_local_file {
public static void main(String args[]) throws Exception {
System.out.println(copyToFile(getConnection(), "/Users/feng/Workspace/region.tbl", "select * from region"));
}
public static Connection getConnection() throws Exception {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://endpoint:port/dbname";
Properties props = new Properties();
// Store credentials in environment variables to avoid hardcoding them
props.setProperty("user", "AAA"); // AccessKey ID
props.setProperty("password", "BBB"); // AccessKey secret
return DriverManager.getConnection(url, props);
}
/**
* Streams a Hologres query result into a local file via COPY TO STDOUT.
*
* @param connection Active JDBC connection
* @param filePath Destination file path
* @param SQL_Query SELECT statement to export
* @return Path of the written file
*/
public static String copyToFile(Connection connection, String filePath, String SQL_Query)
throws SQLException, IOException {
FileOutputStream fileOutputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection) connection);
fileOutputStream = new FileOutputStream(filePath);
copyManager.copyOut("COPY (" + SQL_Query + ") TO STDOUT DELIMITER '|' csv", fileOutputStream);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return filePath;
}
}
Pasos siguientes
Data types overview: tipos de datos compatibles con las operaciones COPY.
Accelerate SQL execution with fixed plan: funcionamiento de los planes fijos.
Comparison of batch write modes: cuándo usar COPY frente a otros métodos de escritura.