本文为您介绍如何使用COPY命令导入客户端的数据至Hologres。

使用限制

使用COPY命令导入数据至Hologres的限制说明如下:
  • 如果导入的是分区表数据,则Hologres只支持导入数据至分区表子表,不支持导入数据至分区表父表。
  • Hologres仅支持使用COPY FROM STDIN命令导入数据,不支持使用COPY TO命令导入。
更多关于COPY命令的用法请参见PostgreSQL官网文档COPY

语法

COPY FROM命令用于从客户端的标准输入导入数据至Hologres。

Hologres支持的COPY语句格式如下。
COPY table_name [ ( column_name [, ...] ) ]
    FROM STDIN
    [ [ WITH ] ( option [, ...] ) ]

   where option can be one of:

    FORMAT format_name
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] )
参数说明如下表所示。
参数 描述
table_name Hologres接收数据的表名称。
STDIN 指定从客户端使用标准输入。
FORMAT 支持TEXTCSV格式。

默认为TEXT格式。

DELIMITER 指定的字段分隔符。

文本格式默认为制表符,CSV格式默认为逗号。例如DELIMITER AS ','

使用示例

  • 使用STDIN导入数据至Hologres,命令如下。
    //创建Hologres表。
    CREATE TABLE copy_test (
      id    int,
      age   int,
      name  text
    ) ;
    
    //导入数据至Hologres表。
    COPY copy_test FROM STDIN WITH DELIMITER AS ',' NULL AS '';
    53444,24,wangming
    55444,38,ligang
    55444,38,luyong
    \.
    
    //查询表中的数据。
    SELECT * FROM copy_test;
    说明 HoloStudio及HoloWeb暂不支持使用命令行方式导入数据。
  • 使用STDIN方式导入CSV格式的文件至Hologres。
    //创建Hologres表。
    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 );
    
    //导入CSV格式的文件至Hologres表。
    COPY partsupp FROM STDIN WITH DELIMITER '|' CSV;  
    1|2|3325|771.64|final theodolites 
    1|25002|8076|993.49|ven ideas
    \.
    
    //查询表中的数据。
    SELECT * FROM partsupp;
    说明 HoloStudio及HoloWeb暂不支持使用命令行方式通过STDIN导入CSV格式的文件。
  • 导入本地文件,命令如下。
    psql -p <port> -h <endpoint> -d <database> -c "COPY <table> from stdin with delimiter '|' csv;" <<filename>;
    说明 HoloStudio及HoloWeb暂不支持使用命令行方式通过STDIN导入本地文件。
  • 使用CopyManager导入JDBC客户端的文件至Hologres,命令如下。
    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();
        //set db user
            props.setProperty("user", "AAA");//当前账号的AccessKey ID。
        //set db password
            props.setProperty("password", "BBB");//当前账号的AccessKey SECRET。
            return DriverManager.getConnection(url, props);
        }
    
        /**
         * 导入文件至数据库。
         * 
         * @param connection
         * @param filePath
         * @param tableName
         * @return
         * @throws SQLException
         * @throws IOException
         */
        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;
        }
    }