我的最终目标是将ngram数据集插入我的Greenplum数据库的内部加载表中。
我有一台运行gpfdist
的服务器。
我已经创建了外部表格(在Greenplum上):
CREATE EXTERNAL TABLE ng_schema.fre2(
id bigserial,
ngram text,
year int4,
match_count int4,
page_count int4,
volume_count int4)
LOCATION ('gpfdist://10.1.8.4:8081/ngram_2009h1/fre-all/2/*.csv')
FORMAT 'TEXT' (HEADER)
LOG ERRORS INTO ng_schema.load_e_fre2 SEGMENT REJECT LIMIT 500 rows;
数据集都说“csv”,但它们不包含逗号。它们包含标签。
#head -n20 *92.csv
! 144 1836 2 2 2
....
接下来,我测试外部表:
SELECT * FROM fre2;
ERROR: Segment reject limit reached. Aborting operation. Last error was
missing data for column "volume_count"...
我进入我的日志错误表并看到:
2016-07-21 20:51:49.05593+00 | fre2 | gpfdist://10.1.8.4:8081/ngram_2009h1/fre-all/2/*.csv [/mnt2/ngram_2009h1/fre-all/2/googlebooks-fre-all-2gram-20090715-0.csv] | | | missing data for column "volume_count" | ! Giscard 1979 2 2
2 |
我试过玩FORMAT 'TEXT' (HEADER)
。我添加了DELIMITER ' '
。我已将其更改为CSV
,但我最终错过了其他列的数据。
我认为问题是“!Giscard”被计为2列。 ngram里面有空格。
或者错误可能是id bigserial
?
关于改变什么的任何想法?
答案 0 :(得分:1)
串行列将成为您的问题。但是您看到的错误似乎与解析时使用的分隔符有关。你使用标签或空格?
下面的是使用制表符分隔符的示例,我创建了两个表。外部表用于将数据读入新表。这里的关键是外部表没有bigserial列。将数据加载到新表时,将自动生成序列ID。
CREATE TABLE fre2_new(
id bigserial,
ngram text,
year int4,
match_count int4,
page_count int4,
volume_count int4);
CREATE EXTERNAL TABLE fre2(
ngram text,
year int4,
match_count int4,
page_count int4,
volume_count int4)
LOCATION ('gpfdist://mdw:8080/dat.txt')
FORMAT 'TEXT' (DELIMITER E'\t')
LOG ERRORS INTO load_e_fre2 SEGMENT REJECT LIMIT 500 rows;
[gpadmin@mdw data]$ cat -vet dat.txt
144^I1836^I2^I2^I2$
144^I1836^I2^I2^I2$
144^I1836^I2^I2^I2$
144^I1836^I2^I2^I2$
insert into fre2_new ( ngram, year, match_count, page_count, volume_count) select * from fre2;
gpadmin=# select * from fre2_new;
id | ngram | year | match_count | page_count | volume_count
----+-------+------+-------------+------------+--------------
3 | 144 | 1836 | 2 | 2 | 2
1 | 144 | 1836 | 2 | 2 | 2
4 | 144 | 1836 | 2 | 2 | 2
2 | 144 | 1836 | 2 | 2 | 2