我想使用外部表将一个普通文件加载到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 TABLE
和YYYY-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/