本文為您介紹如何使用COPY命令導入本地的數據至Hologres或從Hologres中導出數據至本地。
使用限制
使用COPY命令的限制說明如下:
當前COPY命令支持的數據類型與Hologres引擎支持的數據類型一致,詳情參見數據類型匯總。
如果導入的是分區表數據,則Hologres只支持導入數據至分區表子表,不支持導入數據至分區表父表。
Hologres僅支持使用
COPY FROM STDIN
命令導入數據和COPY ( query ) TO STDOUT
命令導出數據。在v1.1.43+版本中,當COPY FROM STDIN時,支持表中有DEFAULT關鍵字以及serial類型字段,早期版本不支持。
不支持僅向表中的某一列導數據。
更多關于COPY
命令的用法請參見COPY指令。
命令格式
COPY FROM
命令用于從客戶端的標準輸入導入數據至Hologres;COPY TO
命令用于將Hologres數據導出至本地文件。
Hologres支持的COPY語句格式如下。
COPY table_name [ ( column_name [, ...] ) ]
FROM STDIN
[ [ WITH ] ( option [, ...] ) ]
COPY { ( query ) }
TO STDOUT
[ [ 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 [, ...] )
ENCODING 'encoding_name'
參數說明
參數說明如下表所示。
參數 | 描述 |
table_name | Hologres接收數據的表名稱。 |
query | 查詢語句。 |
STDIN | 指定從客戶端使用標準輸入。 |
STDOUT | 導出至指定客戶端。 |
FORMAT | 支持TEXT、CSV和BINARY格式。 默認為TEXT格式。僅導出數據、FIXED COPY模式導入數據支持BINARY格式。 |
DELIMITER | 指定的字段分隔符。 文本格式默認為制表符,CSV格式默認為半角逗號(,)。例如 |
NULL | 指定表示一個空值的字符串。
|
HEADER | 指定文件包含標題行,其中包含每一列的名稱。 說明 僅CSV格式支持該選項。 |
QUOTE | 指定一個數據值被引用時使用的引用字符,必須是一個單一的單字節字符。 說明 僅CSV格式支持該選項。默認為雙引號。 |
ESCAPE | 指定應該出現在一個匹配 說明 僅CSV格式支持該選項。默認和 |
FORCE_QUOTE | 強制對指定列中的所有值使用引號(NULL除外)。 說明 僅 |
FORCE_NOT_NULL | 不將指定列的值與空字符串匹配。空值會被讀取為零長度字符串,而非NULL。 說明 僅 |
ENCODING | 指定文件按照encoding_name編碼。默認使用當前的客戶端編碼。 |
使用示例
使用COPY命令導入本地數據
使用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;
說明psql客戶端支持使用STDIN導入數據,DataStudio及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;
說明psql客戶端支持使用STDIN導入數據,DataStudio及HoloWeb暫不支持使用命令行方式通過STDIN導入CSV格式的文件。
導入本地文件至Hologres,命令如下。
psql -U <username> -p <port> -h <endpoint> -d <databasename> -c "COPY <table> from stdin with delimiter '|' csv;" <<filename>;
說明psql客戶端支持使用STDIN導入數據,DataStudio及HoloWeb暫不支持使用命令行方式通過STDIN導入本地文件。由于psql客戶端僅支持STDIN(標準輸入)方式導入數據,需要將文件數據轉換為標準輸入格式。
參數說明:
參數
描述
username
阿里云賬號:當前阿里云賬號的AccessKey ID。您可以單擊AccessKey 管理,獲取AccessKey ID。
建議使用環境變量的方式調用用戶名和密碼,降低密碼泄露風險。
自定義賬號:自定義賬號的用戶名,例如BASIC$abc。
port
Hologres實例的公共網絡端口。
示例取值
80
。endpoint
Hologres實例的公共網絡地址。
示例取值
xxx-cn-hangzhou.hologres.aliyuncs.com
。databasename
Hologres的數據庫名稱。
詳情請參見創建數據庫。
示例取值
mydb
。table
Hologres數據庫中待導入數據的表名。
filename
需要導入的本地文件路徑。
示例取值
D:\tmp\copy_test.csv
。如下示例將指導您在終端執行命令導入本地文件至Hologres。
輸入命令導入本地文件copy_test至Hologres。其中,插入的標準文件內容如下:
01,01,name1 02,01,name2 03,01,name3 04,01,name4
執行完成后,回到psql客戶端可以查詢新插入的數據,如下圖所示。
使用COPY命令導出數據至本地
使用
\copy
導出Hologres的數據至本地文件。說明僅支持psql客戶端使用該方式導出數據。
-- 建表 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'); -- 查數據 select * from copy_to_local; -- 導出數據至本地文件 \copy (select * from copy_to_local) to '/root/localfile.txt';
導入Hologres數據至本地文件。
說明僅支持psql客戶端使用該方式導出數據。
psql -U <username> -p <port> -h <endpoint> -d <databasename> -c "COPY (select * from <tablename>) to stdout with delimiter '|' csv;" ><filename>;
使用CopyManager導入導出
使用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", "******");//當前賬號的AccessKey ID,建議通過環境變量調用,降低密碼泄露風險。 //set db password props.setProperty("password", "******");//當前賬號的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; } }
使用CopyManager導出Hologres的數據至JDBC客戶端的文件,命令如下。
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(); //set db user props.setProperty("user", "******");//當前賬號的AccessKey ID,建議通過環境變量調用,降低密碼泄露風險。 //set db password props.setProperty("password", "******");//當前賬號的AccessKey SECRET,建議通過環境變量調用,降低密碼泄露風險。 return DriverManager.getConnection(url, props); } /** * 導出數據庫數據至客戶端文件。 * * @param connection * @param filePath * @param SQL_Query * @return * @throws SQLException * @throws IOException */ 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; } }
HoloWeb可視化一鍵導入
HoloWeb支持可視化一鍵上傳本地文件,具體操作如下。
進入HoloWeb開發頁面,詳情請參見連接HoloWeb。
在HoloWeb開發頁面的頂部菜單欄,單擊數據方案。
在左側導航欄,選擇一鍵本地文件導入 > 新建數據導入。
配置一鍵本地文件上傳對話框中選擇目標表頁面的各項參數。
參數
描述
作業名稱
新建的作業名稱。
實例名
選擇已登錄的實例名稱。
目標庫
Hologres對應實例中已創建的數據庫名稱。
目標Schema
Hologres中已創建的Schema名稱。
如果您沒有新建Schema,則只能選擇默認創建的public。如果有新建的Schema,您也可以選擇新建的Schema。
選擇要導入的數據表
用于存儲本地文件的表名稱。
導入本地文件前,您需要在目標數據庫中創建一張用于存儲本地文件的表。
單擊下一步,配置選擇數據源表頁面的各項參數。
參數
描述
選擇文件
需要上傳的本地文件。
僅支持上傳TXT、CSV和LOG類型的文件。
說明數據文件列的順序必須和表定義的列順序一致,且列的個數相同。
選擇分隔符
逗號
Tab
分號
空格
|
#
&
您也可以自定義分隔符。
原始字符集
GBK
UTF-8
CP936
ISO-8859
首行為標題
勾選則設置首行數據為標題。
單擊下一步,單擊導入總覽頁面的執行,完成本地文件一鍵導入。
在導入總覽頁面您可以查看本地文件導入的Schema、數據庫、表等信息。