我想使用外部表将一个普通文件加载到Greenplum数据库中。
我可以为时间戳/日期/时间字段指定输入格式吗?(如果你知道PostgreSQL的答案,也请回复)
例如,在Oracle中,我可以使用日期格式日期掩码“yyyymmdd”来说明如何解析日期。对于netezza,我可以指定日期样式“ymd”。我找不到答案。我可以将字段描述为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 '')

最佳答案

似乎您可以:

SET DATESTYLE = 'YMD';

在离开桌子之前。但这将影响对所有日期的解释,而不仅仅是文件中的日期。如果您在其他地方一直使用不含糊的iso日期,这是可以的,但如果(例如)您还需要在同一个查询中接受'd/m/y'日期文本,则可能会出现问题。
这是Greenplum的SELECT特有的,不适用于SQL标准CREATE EXTERNAL TABLE外部数据包装器,如下所示。
让我惊讶的是,postgresql本身(没有这个SQL/MED特性)总是接受iso风格的CREATE EXTERNAL TABLEYYYY-MM-DD日期,而不管YYYYMMDD。注意:
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的行为与此相同,那么您不需要做任何事情就可以从输入文件中正确读取这些DATESTYLE日期。
以下是它在PostgreSQL中的工作原理:
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没有,请提交一个bug。在创建之后改变外部表的读取方式的想法是疯狂的。

关于database - 在Greenplum中格式化外部表(PostgreSQL),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13234818/

10-11 21:34