2017-01-11 31 views
0

私は最近Greenplumデータベースをインストールしましたが、GPLOADユーティリティー・プログラムとyaml制御ファイルを使用してデータをインポートしようとしています。Greenplum gpload - 最後のエラー:最後の予想カラムの後の余分なデータ

私の表は、この(擬似)のようになります。

Table1 
- column1 integer 
- column2 integer 
- column3 integer 
- column4 character(6) 

だから私のYAML制御ファイル内の列は次のようになります。

- COLUMNS 
     - column1: integer 
     - column2: integer 
     - column3: integer 
     - column4: text 

しかし、私のCSVの内容は次のようになります。

1, 2, 3, "test 1", , ,<br> 
3, 2, 0, "test 2", , ,<br> 
4, 0, 2, "test 3", , ,<br> 

CSVファイルの末尾に「空」フィールドがあることに注意してください。今すぐCSVファイルに300個のフィールドがあり、テーブル内に100個のフィールドしかないと想像してください。私のCSVファイルは常に300以上のフィールドを持ち、私のカラムは常に100です。
私は制御ファイルまたはテーブルのすべての300列を指定したくありません。
これらのフィールドに値または列が定義されていないため、後続のフィールドを無視したいと考えています。

OracleローダーのようにNULLCOLSを無視したいと思います。

私は、次のエラーを取得しています:

"LAST ERROR: Extra data after last expected column"

任意の提案をいただければ幸いです!

答えて

1

gploadを使用する場合は、ymlファイルの「マッピング」機能を使用します。ここに例があります。

まず、2列の表を作成します。ここでは

[[email protected] ~]$ psql 
SET 
Timing is on. 
psql (8.2.15) 
Type "help" for help. 

gpadmin=# create table public.test (col1 text, col2 text) distributed randomly; 
CREATE TABLE 
Time: 16.494 ms 
gpadmin=# \q 

は、データの5列を持つテストファイルですが、私のテーブルには、唯一の2

[[email protected] ~]$ cat testfile.txt 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 
"col1"|"col2"|"col3"|"col4"|"col5" 

があり、YAMLファイルを作成します末尾の列を無視してcol1とcol2をcol2にマッピングします。

[[email protected] ~]$ cat test.yml 
--- 
VERSION: 1.0.0.1 
DATABASE: gpadmin 
USER: gpadmin 
HOST: gpdbsne 
PORT: 5432 
GPLOAD: 
    INPUT: 
    - SOURCE: 
    LOCAL_HOSTNAME: 
     - gpdbsne 
    PORT: 8999 
    FILE: 
     - /home/gpadmin/testfile.txt 
    - FORMAT: text 
    - DELIMITER: '|' 
    - QUOTE: '"' 
    - COLUMNS: 
     - col1: text 
     - col2: text 
     - col3: text 
     - col4: text 
     - col5: text 
    OUTPUT: 
    - TABLE: public.test 
    - MODE: insert 
    - MAPPING: 
      col1: col1 
      col2: col2 

gploadを使用してデータを読み込みます。

[[email protected] ~]$ gpload -f test.yml 
2017-01-12 12:25:48|INFO|gpload session started 2017-01-12 12:25:48 
2017-01-12 12:25:48|INFO|started gpfdist -p 8999 -P 9000 -f "/home/gpadmin/testfile.txt" -t 30 
2017-01-12 12:25:48|INFO|running time: 0.12 seconds 
2017-01-12 12:25:48|INFO|rows Inserted   = 10 
2017-01-12 12:25:48|INFO|rows Updated   = 0 
2017-01-12 12:25:48|INFO|data formatting errors = 0 
2017-01-12 12:25:48|INFO|gpload succeeded 

データを確認している。

また
[[email protected] ~]$ psql -c "select * from public.test" 
    col1 | col2 
--------+-------- 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
"col1" | "col2" 
(10 rows) 

、あなたは外部テーブルを指定し、挿入を行うことができます。これは、gploadもやっていることです。これは、gpfdistプロセスを作成し、外部テーブルでデータをロードするための単なるラッパーです。

[[email protected] ~]$ gpfdist -p 8999 > load.log 2>&1 < load.log & 
[1] 12840 
[[email protected] ~]$ psql 
SET 
Timing is on. 
psql (8.2.15) 
Type "help" for help. 

gpadmin=# create external table public.ext_testfile (col1 text, col2 text, col3 text, col4 text, col5 text) location ('gpfdist://gpdbsne:8999/testfile.txt') format 'text' (delimiter '|'); 
CREATE EXTERNAL TABLE 
Time: 7.843 ms 
gpadmin=# insert into public.test select col1, col2 from public.ext_testfile; 
INSERT 0 10 
Time: 36.925 ms 
gpadmin=# 
+0

ありがとうJon、マッピングはトリックでした! – zdb

1

データ全体をインポートするには1列を定義し、正規表現または部分文字列を使用して別のテーブルに解析してください。 例: insert into table second_table first_tableから部分文字列(c1、.....)を選択します。

+0

こんにちは、ありがとうございました。これは、テーブルに挿入して別のテーブルに挿入する必要があるため、時間が2倍になります。パフォーマンスは悪くなります。私はここで大きなデータについて話しています。各300 +行と1000000レコード1000ファイルを想像してください... – zdb

+0

ここでのgploadドキュメントを確認してくださいhttp://gpdb.docs.pivotal.io/4360/utility_guide/admin_utilities/gpload.html gploadはgpfdistのラッパーです。ファイルを指す外部テーブルを作成し、外部テーブルを選択することからgpdb内部テーブルの挿入/更新を実行します。 yamlのMAPPINGオプションで部分文字列または正規表現を定義できるかどうかを調べることができます。または単にgpfdistを使用して外部テーブルを作成し、内部テーブルにデータを挿入し、cronジョブを使用してデータを自動的にロードします。私はそれが積み込み時間を2倍にするとは思わない。 –

関連する問題