質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • PostgreSQL

    719questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

複数のCSVを同時にSQLへ読み込む

受付中

回答 3

投稿 2017/12/01 11:20

  • 評価
  • クリップ 0
  • VIEW 56

midsum0323

score 16

前提・実現したいこと

複数のCSVをpostgreSQLで次の順で読み込みたいと考えております
①各CSVをcopy文で読み込む
②読み込んだものを統合する

なお、先にCSVをwindowsのコマンドで統合し読み込むことはできたのですが、
100個程度計30GbのCSVを統合するのに半日以上かかり、
もう少し負荷を減らせないかと思い上記の方法を考えております。

※質問を分けたほうがいい場合はお申し付けください。

元データ

moji1.csv
NO,komoji,omoji
1,a,A

moji2.csv
NO,komoji,omoji
2,b,B

moji3.csv
NO,komoji,omoji
3,c,C

実現したいもの

テーブルMOJI
NO|komoji|omoji
1|a|A
2|b|B
3|c|C

自作コード

不明な部分は/* 不明(理由) */と表記

--格納するテーブル
create table MOJI(
no,int
komoji,text
omoji,text 
);

--ループ開始
--forでcsv読み込み
for i in 1..3 loop
--一時テーブル作成
create temp table mojitemp(
no,int
komoji,text
omoji,text 
);

--csv読み込み
copy mojitemp from E'C:\\~\\/* 不明(ファイル名をどう表記するかわかりません) */.csv' with csv header;

--統合先へ
insert into MOji
select *
from mojitemp;

--iを1増やす
1=i+1;
end loop;
――loopおわり

補足情報(言語/FW/ツール等のバージョンなど)

windows10
PostgreSQL 9.6.5

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

csvファイルのデータ形式は共通しているようですから、 [PostgreSQL]DB に大量データ インポートしてみた PostgreSQL編 ~ まとめ感想 の記事にあるような方法でcsvファイルを直接postgreSQLにインポートする方法が簡単なように思えます。
postgreSQLに入れる前に30GBものcsvファイルを生成する手間が減りますから。

投稿 2017/12/01 12:03

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Windowsの環境が無いので想像ですが

FOR %i IN (moji*.csv) DO psql db -U hoge -c"copy MOJI from stdin with csv header" <%i

負荷の改善には成りませんが、複数処理を並列に実行すれば、時間は短くすることができると思います。
ディレクトリに分けて複数実行して早くなるかはマシンの性能に寄るところが大きいです。

ps:create table のカンマの位置が違っております。

投稿 2017/12/01 12:34

編集 2017/12/01 12:41

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

遅い理由はinsertを行っているからだと思われます。
insertによって考えられる遅い理由は2つ。
1.トランザクション量が多い
2.insert先のテーブルにインデックスがある。

1.についてはcopyコマンドで直接テーブルを指定することで解決すると思います。
2.については処理前にindexをdropし、データ投入後にinndexをcreateするようにすれば高速化が図れます。
※尚、pg_bulkloadを使用すれば、インデックスがあっても(というかあった方が)さらに高速に処理できます。

尚、投入先のデータは多分インデックスを使用されていると思いますが、その場合には、データ投入後にCLASTERを行って適切な状態にしてあげて下さい。

投稿 2017/12/01 17:47

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • PostgreSQL

    719questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。