Greenplum gpload - Last Error: Extra data after last expected column
Greenplum gpload - Last Error: Extra data after last expected column
我最近安装了 Greenplum 数据库,现在我正在尝试使用 GPLOAD 实用程序和 yaml 控制文件导入数据。
我的table长这样(伪):
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
文件中的尾随 "empty" 字段。现在假设 CSV
文件中有 300 个字段,而 table 中只有 100 列。我的 CSV
文件总是有 300 个或更多字段,我的列总是 100。
我不想在控制文件或 table 中指定所有 300 列。
我想忽略尾随字段,因为不会为这些字段定义任何值或列...
我想像 Oracle Loader 一样忽略 TRAILING NULLCOLS。
我收到以下错误:
"LAST ERROR: Extra data after last expected column
"
如有任何建议,我们将不胜感激!
尝试定义 1 列来导入整个数据,然后使用正则表达式或子字符串将其解析为另一个 table。
例如:
从 first_table;
插入 table second_table select substring(c1,.....)
如果要使用gpload,请使用yml 文件中的"mapping" 特性。这是一个例子。
首先,创建一个包含 2 列的 table:
[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 列数据的测试文件,但我的 table 只有 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 到 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)
或者,您可以指定外部 table 并进行插入。这也是 gpload 正在做的事情。它只是一个包装器,用于创建 gpfdist 进程并使用外部 table.
加载数据
[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=#
我最近安装了 Greenplum 数据库,现在我正在尝试使用 GPLOAD 实用程序和 yaml 控制文件导入数据。
我的table长这样(伪):
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
文件中的尾随 "empty" 字段。现在假设 CSV
文件中有 300 个字段,而 table 中只有 100 列。我的 CSV
文件总是有 300 个或更多字段,我的列总是 100。
我不想在控制文件或 table 中指定所有 300 列。
我想忽略尾随字段,因为不会为这些字段定义任何值或列...
我想像 Oracle Loader 一样忽略 TRAILING NULLCOLS。
我收到以下错误:
"LAST ERROR: Extra data after last expected column
"
如有任何建议,我们将不胜感激!
尝试定义 1 列来导入整个数据,然后使用正则表达式或子字符串将其解析为另一个 table。 例如: 从 first_table;
插入 table second_table select substring(c1,.....)如果要使用gpload,请使用yml 文件中的"mapping" 特性。这是一个例子。
首先,创建一个包含 2 列的 table:
[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 列数据的测试文件,但我的 table 只有 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 到 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)
或者,您可以指定外部 table 并进行插入。这也是 gpload 正在做的事情。它只是一个包装器,用于创建 gpfdist 进程并使用外部 table.
加载数据[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=#