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テーブルから出る前に。ただし、これは、ファイルからの日付だけでなく、すべての日付の解釈に影響します。他の場所で明確なISO日付を一貫して使用している場合は問題ありませんが、(たとえば)同じクエリで「D / M/Y」日付リテラルも受け入れる必要がある場合は問題になる可能性があります。

これはGreenPlumに固有であり、以下に示すように、CREATE EXTERNAL TABLESQL標準の外部データラッパーには適用されません。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を使用して、変換を定義することもできます。どちらのソリューションも、上記のソリューションと同様です。

整数と日付をスペースで区切って年月日で表した単純なファイルを次に示します。

date1.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 に答える