【问题标题】:Greenplum gpload - Last Error: Extra data after last expected columnGreenplum gpload - 最后一个错误:最后一个预期列之后的额外数据
【发布时间】:2017-01-11 10:27:17
【问题描述】:

我最近安装了 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>

注意CSV 文件中的尾随“空”字段。现在想象CSV 文件中有 300 个字段,而表中只有 100 列。我的 CSV 文件将始终包含 300 或更多字段,而我的列将始终为 100。
我不想在控制文件或表中指定所有 300 列
我想忽略尾随字段,因为不会为这些字段定义任何值或列...

我想像 Oracle Loader 一样忽略 TRAILING NULLCOLS。

我收到以下错误:

LAST ERROR: Extra data after last expected column

任何建议将不胜感激!

【问题讨论】:

    标签: greenplum


    【解决方案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"
    

    现在,使用 col1 到 col1 和 col2 到 col2 的映射创建一个 yaml 文件,同时忽略尾随列。

    [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=# 
    

    【讨论】:

    • @JonRoberts ths!
    【解决方案2】:

    尝试定义 1 列来导入整个数据,然后使用正则表达式或子字符串将其解析到另一个表中。 例如: 插入表 second_table 中 select substring(c1,.....) from first_table;

    【讨论】:

    • 您好,谢谢您的回答。这将使时间加倍,因为我必须先插入一个表,然后再插入另一个表。性能会很差。我在这里谈论的是大数据。想象一下 1000 个文件,每个文件有 300 多行和 1000000 条记录......
    • 在此处查看 gpload 文档gpdb.docs.pivotal.io/4360/utility_guide/admin_utilities/… gpload 是 gpfdist 的包装器。它涉及创建指向文件的外部表,然后通过选择外部表执行插入/更新 gpdb 内部表。您可以检查是否可以在 yaml 的 MAPPING 选项中定义子字符串或正则表达式。或者只是使用 gpfdist 创建外部表并将数据插入内部表,然后使用 cron 作业自动加载数据。我不认为它会使加载时间加倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多