1

我想使用外部表将一个普通文件加载到 Greenplum 数据库中。我可以为时间戳/日期/时间字段指定输入格式吗?(如果你知道 PostgreSQL 的答案,也请回复)

例如,对于 Oracle,我可以使用 DATE_FORMAT DATE MASK 'YYYYMMDD' 来告诉如何解析日期。对于 Netezza,我可以指定 DATESTYLE 'YMD'。对于 Greenplum,我找不到答案。我可以将字段描述为 char,然后在加载期间解析它们,但这是一个丑陋的解决方法。

这是我的暂定代码:

CREATE EXTERNAL TABLE MY_TBL (X date, Y time, Z timestamp ) 
LOCATION (
 'gpfdist://host:8001/file1.txt',
 'gpfdist://host:8002/file2.txt'
) FORMAT 'TEXT' (DELIMITER '|' NULL '')
4

2 回答 2

2

看来您可以:

SET DATESTYLE = 'YMD';

SELECT在从表中 ing之前。但是,这将影响所有日期的解释,而不仅仅是文件中的那些。如果您在其他地方始终使用明确的 ISO 日期,那会很好,但如果(例如)您还需要在同一查询中接受“D/M/Y”日期文字,则可能会出现问题。

这是特定于 GreenPlum 的CREATE EXTERNAL TABLE,不适用于 SQL 标准的SQL/MED外部数据包装器,如下所示。


令我惊讶的是,PostgreSQL 本身(没有此CREATE EXTERNAL TABLE功能)总是接受 ISO 样式YYYY-MM-DDYYYYMMDD日期,而不管DATESTYLE. 观察:

regress=> SELECT '20121229'::date, '2012-12-29'::date, current_setting('DateStyle');
    date    |    date    | current_setting 
------------+------------+-----------------
 2012-12-29 | 2012-12-29 | ISO, MDY
(1 row)

regress=> SET DateStyle = 'DMY';
SET
regress=> SELECT '20121229'::date, '2012-12-29'::date, current_setting('DateStyle');
    date    |    date    | current_setting 
------------+------------+-----------------
 2012-12-29 | 2012-12-29 | ISO, DMY
(1 row)

...因此,如果 GreenPlum 的行为方式相同,则您无需执行任何操作即可YYYYMMDD从输入文件中正确读取这些日期。

以下是它与 PostgreSQLfile_fdw SQL/MED外部数据包装器的工作方式:

CREATE EXTENSION file_fdw;

COPY (SELECT '20121229', '2012-12-29') TO '/tmp/dates.csv' CSV;

SET DateStyle = 'DMY';

CREATE SERVER csvtest FOREIGN DATA WRAPPER file_fdw;

CREATE FOREIGN TABLE csvtest (
    date1 date,
    date2 date
) SERVER csvtest OPTIONS ( filename '/tmp/dates.csv', format 'csv' );

SELECT * FROM csvtest ;
   date1    |   date2    
------------+------------
 2012-12-29 | 2012-12-29
(1 row)

CSV 文件内容为:

20121229,2012-12-29

因此您可以看到 Pg 将始终接受 CSV 的 ISO 日期,而不管日期样式如何。

如果 GreenPlum 没有,请提交一个错误。DateStyle在创建后更改外部表的读取方式的想法是疯狂的。

于 2012-11-07T00:37:59.060 回答
0

是的你可以。

为此,您可以将外部表中的字段指定为文本类型。然后,在插入语句中使用转换。您还可以使用 gpload 并定义转换。两种解决方案都类似于上述解决方案。

这是一个简单的文件,其中包含一个整数和一个表示为年月日的日期,用空格分隔:

日期1.txt

1|2012 10 12
2|2012 11 13

启动 gpfdist:

gpfdist -p 8010 -d ./ -l ./gpfdist.log &

使用 psql 创建外部表、目标表并加载数据:

psql test

test=# create external table ext.t2( i int, d text ) 
  location ('gpfdist://walstl-mbp.local:8010/date1.txt') 
  format 'TEXT' ( delimiter '|' )
;


test=# select * from ext.t2; i |     d      
---+------------
  1 | 2012 10 12
  2 | 2012 11 13
(2 rows)

现在,创建将数据加载到的表:

test=# create table test.t2 ( i int, d date ) 
;

并且,加载表格:

test=# insert into test.t2 select i, to_date(d,'YYYY MM DD') from ext.t2 ;

test=# select * from test.t2;
 i |     d      
---+------------
 1 | 2012-10-12
 2 | 2012-11-13
于 2012-11-06T01:27:38.023 回答