このトピックでは、COPY 文を使用してオンプレミスデータを Hologres にインポートする方法、または Hologres データをオンプレミスファイルにエクスポートする方法について説明します。
制限
COPY 文を使用してデータをインポートまたはエクスポートする場合は、次の点に注意してください。
COPY 文は、Hologres でサポートされているデータ型をサポートしています。 詳細については、「データ型」をご参照ください。
COPY 文を使用してパーティションテーブルから Hologres にデータをインポートする場合、親パーティションテーブルではなく子パーティションテーブルにのみデータをインポートできます。
Hologres にデータをインポートするには、
COPY FROM STDIN文を実行する必要があります。 Hologres からデータをエクスポートするには、COPY ( query ) TO STDOUT文を実行する必要があります。Hologres V1.1.43 以降では、COPY FROM STDIN 文は、DEFAULT 制約で作成されたテーブルと、SERIAL データ型の列を含むテーブルをサポートしています。 COPY FROM STDIN 文は、以前のバージョンの Hologres ではこれらのテーブルをサポートしていません。
テーブルの 1 つの列にのみデータをインポートすることはできません。
COPY 文の詳細については、「COPY」をご参照ください。
操作プラットフォーム
このトピックで説明されている文は、PostgreSQL クライアントで実行する必要があります。 詳細については、「PostgreSQL クライアント」をご参照ください。
構文
COPY FROM 文を使用して、クライアントの stdin から Hologres にデータをインポートし、COPY TO 文を使用して、Hologres データをクライアントにエクスポートできます。
構文:
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 | 指定されたクライアントの stdin からデータをインポートします。 |
STDOUT | 指定されたクライアントにデータをエクスポートします。 |
FORMAT | 有効な値:TEXT、CSV、BINARY。 デフォルト値:TEXT。BINARY データ型のデータをエクスポートできます。固定コピーモードでのみ、BINARY データ型のデータをインポートできます。 |
DELIMITER | 列を区切るために使用するデリミタ。 デフォルトのデリミタは、テキスト形式ではタブ文字、CSV 形式ではカンマ (,) です。例: |
NULL | NULL 値を表すために使用する文字列。
|
HEADER | ファイルにヘッダー行が含まれているかどうかを指定します。ヘッダー行の値は、ファイル内の列名です。 説明 このパラメーターは、CSV 形式のデータに対してのみ有効です。 |
QUOTE | データ値を参照するために使用される 1 バイト文字。 説明 このパラメーターは、CSV 形式のデータに対してのみ有効です。デフォルトでは、二重引用符 (") が使用されます。 |
ESCAPE |
説明 このパラメーターは、CSV 形式のデータに対してのみ有効です。デフォルトでは、値は |
FORCE_QUOTE | 指定された列のすべての非 NULL 値に引用符 (') を強制的に使用します。 説明 このパラメーターは、 |
FORCE_NOT_NULL | 指定された列では、NULL 値を表す文字列は一致しません。代わりに、NULL 値は長さゼロの文字列として読み取られます。 説明 このパラメーターは、 |
ENCODING | ファイルに使用するエンコード方式。デフォルトでは、クライアントのエンコード方式が使用されます。 |
例
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 \. -- Hologres テーブルのデータをクエリします。 SELECT * FROM copy_test;説明PostgreSQL クライアントでは、stdin からデータをインポートできます。DataStudio と HoloWeb では、コマンドラインを使用して stdin から Hologres にデータをインポートすることはできません。
次の文を実行して、stdin から Hologres に CSV ファイルをインポートします。
-- 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 ); -- 作成した Hologres テーブルに CSV ファイルをインポートします。 COPY partsupp FROM STDIN WITH DELIMITER '|' CSV; 1|2|3325|771.64|final theodolites 1|25002|8076|993.49|ven ideas \. -- Hologres テーブルのデータをクエリします。 SELECT * FROM partsupp;説明PostgreSQL クライアントでは、stdin からデータをインポートできます。DataStudio と HoloWeb では、コマンドラインを使用して stdin から Hologres に CSV ファイルをインポートすることはできません。
次の文を実行して、オンプレミスファイルを Hologres にインポートします。
psql -U <username> -p <port> -h <endpoint> -d <databasename> -c "COPY <table> from stdin with delimiter '|' csv;" <<filename>;説明PostgreSQL クライアントでは、stdin からデータをインポートできます。DataStudio と HoloWeb では、コマンドラインを使用して stdin から Hologres にオンプレミスファイルをインポートすることはできません。PostgreSQL クライアントを使用する場合、stdin からのみデータをインポートできます。したがって、インポートするファイル内のデータの形式を標準入力形式に変換する必要があります。
次の表は、文のパラメーターについて説明しています。
パラメーター
説明
username
Alibaba Cloud アカウント:Alibaba Cloud アカウントの AccessKey ID。AccessKey ページから AccessKey ID を取得できます。
環境変数を構成し、環境変数から AccessKey ID と AccessKey シークレットを取得することをお勧めします。これは、リークのリスクを軽減するのに役立ちます。
カスタムアカウント:カスタムアカウントのユーザー名。例:BASIC$abc。
port
Hologres インスタンスのパブリックポート番号。
例:
80。endpoint
Hologres インスタンスのパブリックエンドポイント。
例:
xxx-cn-hangzhou.hologres.aliyuncs.com。databasename
Hologres データベースの名前。
詳細については、「データベースの作成」をご参照ください。
例:
mydb。table
データをインポートする Hologres テーブルの名前。
filename
Hologres にインポートするローカルファイルのパス。
例:
D:\tmp\copy_test.csv。次の例は、stdin から Hologres にオンプレミスファイルをインポートする文を実行する方法を示しています。
文を実行して、copy_test という名前のオンプレミスファイルを stdin から Hologres にインポートします。
インポートされた標準ファイルには、次のコンテンツが含まれています。01,01,name1 02,01,name2 03,01,name3 04,01,name4文が実行されたら、PostgreSQL クライアントに戻ります。次に、次の図に示すように、新しくインポートされたデータをクエリできます。

COPY 文を使用してクライアントにデータをエクスポートする
\copy文を実行して、Hologres データをオンプレミスファイルにエクスポートします。説明このメソッドを使用して、Hologres データを PostgreSQL クライアントのオンプレミスファイルにのみエクスポートできます。
-- テーブルを作成します。 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 データをオンプレミスファイルにエクスポートします。
説明このメソッドを使用して、Hologres データを PostgreSQL クライアントのオンプレミスファイルにのみエクスポートできます。
psql -U <username> -p <port> -h <endpoint> -d <databasename> -c "COPY (select * from <tablename>) to stdout with delimiter '|' csv;" ><filename>;
CopyManager を使用してデータをインポートおよびエクスポートする
次の文を実行して、CopyManager を使用して Java Database Connectivity ( 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(); // DB ユーザーを設定します props.setProperty("user", "******");// 現在のアカウントの AccessKey ID。環境変数を構成し、環境変数から AccessKey ID を取得することをお勧めします。これは、情報漏えいを防ぐのに役立ちます。 // DB パスワードを設定します props.setProperty("password", "******");// 現在のアカウントの AccessKey シークレット。環境変数を構成し、環境変数から AccessKey シークレットを取得することをお勧めします。これは、情報漏えいを防ぐのに役立ちます。 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(); // DB ユーザーを設定します props.setProperty("user", "******");// 現在のアカウントの AccessKey ID。環境変数を構成し、環境変数から AccessKey ID を取得することをお勧めします。これは、情報漏えいを防ぐのに役立ちます。 // DB パスワードを設定します props.setProperty("password", "******");// 現在のアカウントの AccessKey シークレット。環境変数を構成し、環境変数から AccessKey シークレットを取得することをお勧めします。これは、情報漏えいを防ぐのに役立ちます。 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 を使用すると、視覚化された方法で数回クリックするだけで、オンプレミスファイルを Hologres にアップロードできます。
HoloWeb コンソールにログオンします。詳細については、「HoloWeb に接続してクエリを実行する」をご参照ください。
HoloWeb コンソールで、上部のナビゲーションバーの [データソリューション] をクリックします。
左側のナビゲーションウィンドウで、[オンプレミスファイルのインポート] をクリックします。表示されるページで、[新しいデータインポート] をクリックします。
[オンプレミスファイルのインポート] ダイアログボックスで、[宛先テーブルの選択] ステップのパラメーターを構成します。

パラメーター
説明
ジョブ名
インポートジョブの名前。
インスタンス名
接続されているインスタンスの名前。
宛先データベース
宛先テーブルが属するデータベースの名前。
宛先スキーマ
宛先テーブルが属するスキーマの名前。
スキーマを作成していない場合は、デフォルトスキーマ [public] を選択します。カスタムスキーマを作成した場合は、作成したスキーマを選択できます。
宛先テーブル
オンプレミスファイルのデータをインポートする宛先テーブルの名前。
オンプレミスファイルからデータをインポートする前に、宛先データベースにテーブルを作成して、オンプレミスファイルのデータを格納する必要があります。
[次へ] をクリックし、[ファイルのアップロード] ステップのパラメーターを構成します。
パラメーター
説明
ファイルの選択
アップロードするオンプレミスファイル。
.txt、.csv、.log ファイルのみがサポートされています。
説明オンプレミスファイルと宛先テーブルには、同じ数の列が含まれている必要があります。オンプレミスファイルの列は、宛先テーブルで定義されている列と同じ順序である必要があります。
デリミタ
オンプレミスファイルのフィールドを区切るために使用するデリミタ。有効な値:[カンマ( , )]。
[タブ]
[セミコロン ( ; )]
[スペース]
[|]
[#]
[&]
カスタムデリミタを指定することもできます。
文字エンコーディング
[GBK]
[UTF-8]
[CP936]
[ISO-8859]
最初の行をヘッダーとして使用
最初の行をテーブルヘッダーとして使用するかどうかを指定します。
[次へ] をクリックします。[インポートの概要] ステップで、[実行] をクリックしてオンプレミスファイルをインポートします。
[インポートの概要] ステップでは、オンプレミスファイルのインポート先のスキーマ、データベース、テーブルなどのタスク情報も表示できます。