Greenplum ngram 数据集:缺少列数据
Greenplum ngram dataset: missing data for column
我的最终目标是将 ngram 数据集插入到我的 Greenplum 数据库的内部负载 table 中。
我有一个服务器 运行 gpfdist
。
我创建了外部 tables(在 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
....
接下来,我测试外部table:
SELECT * FROM fre2;
ERROR: Segment reject limit reached. Aborting operation. Last error was
missing data for column "volume_count"...
我进入日志错误 table 并看到:
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
?
有什么要更改的想法吗?
在这种情况下,串行列将成为您的问题。但是您看到的错误似乎与解析时使用的定界符有关。您使用的是制表符还是空格?
下面是使用制表符作为分隔符的示例,我创建了两个 table。外部table用于将数据读入新的table。这里的关键是外部 table 没有 bigserial 列。当您将数据加载到新的 table 时,序列号将自动生成。
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
我的最终目标是将 ngram 数据集插入到我的 Greenplum 数据库的内部负载 table 中。
我有一个服务器 运行 gpfdist
。
我创建了外部 tables(在 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
....
接下来,我测试外部table:
SELECT * FROM fre2;
ERROR: Segment reject limit reached. Aborting operation. Last error was
missing data for column "volume_count"...
我进入日志错误 table 并看到:
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
?
有什么要更改的想法吗?
在这种情况下,串行列将成为您的问题。但是您看到的错误似乎与解析时使用的定界符有关。您使用的是制表符还是空格?
下面是使用制表符作为分隔符的示例,我创建了两个 table。外部table用于将数据读入新的table。这里的关键是外部 table 没有 bigserial 列。当您将数据加载到新的 table 时,序列号将自动生成。
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