Greenplum gpload - 上一个错误:上一个预期列之后的额外数据

时间:2017-01-11 10:27:17

标签: greenplum

我最近安装了Greenplum数据库,现在我尝试使用GPLOAD实用程序和yaml控制文件导入数据。

我的表看起来像这样(伪):

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>

注意尾随&#34;空&#34; CSV文件中的字段。现在假设在CSV文件中有300个字段,表中只有100个字段。我的CSV个文件总是有300个或更多字段,我的列总是100个 我想要在控制文件或表格中指定所有300列
我想忽略尾随字段,因为没有为这些字段定义值或列...

我希望像Oracle Loader一样,非常跟踪NULLCOLS。

我收到以下错误:

&#34; LAST ERROR: Extra data after last expected column&#34;

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

尝试使用define 1列导入整个数据,然后使用regex或substring将其解析为另一个表。 例如: 从first_table插入表second_table select substring(c1,.....);

答案 1 :(得分:1)

如果要使用gpload,请使用yml文件中的“映射”功能。这是一个例子。

首先,创建一个包含2列的表:

[gpadmin@gpdbsne ~]$ 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列。

[gpadmin@gpdbsne ~]$ 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的MAPPING为col1,col2为col2,而忽略尾随列。

[gpadmin@gpdbsne ~]$ 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加载数据。

[gpadmin@gpdbsne ~]$ 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

验证数据是否存在:

[gpadmin@gpdbsne ~]$ 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进程并使用外部表加载数据的包装器。

[gpadmin@gpdbsne ~]$ gpfdist -p 8999 > load.log 2>&1 < load.log &
[1] 12840
[gpadmin@gpdbsne ~]$ 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=#