2013-07-15 15 views
5

パッケージがあります:RMySQLRデータをMYSQLデータベースにアップロード

Rから大量のデータを一括アップロードする方法を教えてください。私は約100万行と80列のCSVを持っています。

この作品は気に入っていますか?私は、これは行ずつ挿入恐れる

dbWriteTable(con, "test2", "~/data/test2.csv") ## table from a file 

...あなたが同時に同じクライアントから多くの行を挿入する場合は、あなたが複数の値を持つINSERTステートメントを使用することができます

+0

私もMySQLのコマンドラインツールを検討したいです代わりに。 –

+1

Sequel Pro(Macの場合)やHeidi SQL(Windowsの場合)などのcsvインポートオプションが必要なMySQL GUIもあります... – Carson

+1

データがRの外にあり、 Rの外では、Rが関与するべきではありません。それは物事を遅くし、間違ってしまう中間ステップをたくさん導入します。 Rでできることの1つは、最初の数行だけをロードしてヘッダーと列のタイプを検査することです。これは、テーブル構造が正しいことを確認するのに役立ちます。 –

答えて

3

INSERT INTO test2(col1, col2, col3, col4) 
VALUES 
('val1', 'val2', val3, val4), 
('val1', 'val2', val3, val4), 
('val1', 'val2', val3, val4) 

ここでは、クエリを作成する方法の例を示します。私はここdata.tableを使用しています:

dat <- matrix(seq(4*3), 3, 4) 
library(data.table) 
DT <- data.table(t(dat)) 
query <- paste('INSERT INTO test2(col1, col2, col3, col4)\nVALUES\n', 
       gsub('c','',(DT[,paste(.SD,collapse='\n')]))) 

    cat(query) 
INSERT INTO test2(col1, col2, col3, col4) 
VALUES 
(1, 4, 7, 10) 
(2, 5, 8, 11) 
(3, 6, 9, 12) 

を、あなたがdbGetQueryを使用して、それを実行することができます:あなたが大量のデータがLOAD DATAを使用することを検討しておりますので

dbGetQuery(con, query) 
+0

も面白いアプローチです!私はそれを試み、速度を比較します – user670186

+1

これは素晴らしいです!まさに私が必要なもの! – marbel

+1

あなたのデータがdata.frame b/cの 't(myData)'にある場合、この答えはうまくいかず、一般的にdata.framesには意味がありません。 – Jthorpe

5

。これは、mysqlドキュメントに従ってファイルからデータをインポートする最も速い方法です。

LOAD DATA INFILE
LOAD DATA INFILEステートメントは、非常に高速でテーブルにテキストファイルから行を読み取ります。

Speed of INSERT Statements
テキストファイルからテーブルをロードする場合は、LOAD DATA INFILEを使用します。 これは、 です。通常、INSERTステートメントを使用するよりも、12倍高速です。セクション 13.2.6、「LOAD DATA INFILE構文」を参照してください。
...
ちょうど概要を説明した戦略を使用している場合でも、INSERTはLOAD DATA INFILEよりもデータをロードするのにずっと遅いです。

LOAD DATA INFILE '/path/to/your/file.csv' 
INTO TABLE contacts 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' -- or '\r\n' 
IGNORE 1 LINES; -- use IGNORE if you have a header line in your file 
3

だけpetermの答え@洗い流すために、ここでLOAD DATA INFILE経由のMySQLへのdata.frameをロードする機能です:

saveData <- function(data, # a data frame 
        tableName, # table name, possibly qualified (e.g. "my_db.customers") 
        ...) # arguments to DBI::dbConnect 
        { 

    query <- sprintf("LOAD DATA INFILE '%s' 
INTO TABLE %s 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' -- or '\r\n' 
IGNORE 1 LINES;" , TEMPFILE,tableName) 

    # WRITE THE DATA TO A LOCAL FILE 
    TEMPFILE <- tempfile(fileext='.csv') 
    write.csv(data,TEMPFILE) 
    on.exit(file.remove(TEMPFILE)) 

    # CONNECT TO THE DATABASE 
    db <- dbConnect(MySQL(), ...) 

    # SUBMIT THE UPDATE QUERY AND DISCONNECT 
    dbGetQuery(db, query) 
    dbDisconnect(db) 
}