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