2013-07-15 3 views
5

есть пакет: RMySQLR массовая загрузка данных в базу данных MYSQL

Как я могу загрузить много данных в mysql из R? У меня есть csv с около 1 миллиона строк и 80 столбцов.

Будет что-то вроде этой работы?

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

Я боюсь, что это вставляет построчно ...

+0

Я бы также рассмотреть инструмент командной строки для MySQL как альтернатива. –

+1

Существуют также графические интерфейсы MySQL, такие как Sequel Pro (для Mac) и Heidi SQL (для Windows), которые должны иметь параметр импорта csv ... – Carson

+1

Если ваши данные находятся за пределами R, и вы отправляете их в пункт назначения, вне R, вам не следует привлекать R. Это просто замедлит работу и представит много промежуточных шагов, которые могут пойти не так. Одно, что вы можете сделать в R, - это загрузить только первые несколько строк для проверки заголовков и типов столбцов. Это может быть полезно для обеспечения правильной структуры таблицы. –

ответ

3

Если вы вставляете много строк из одного клиента в то же время, Вы можете использовать операторы INSERT с несколькими значениями

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:

dbGetQuery(con, query) 
+0

тоже интересный подход! Я попробую и сравним скорости – user670186

+1

это замечательно! именно то, что мне нужно! – marbel

+1

Этот ответ не работает, если ваши данные находятся в файле data.frame b/c 't (myData)' не имеет смысла для data.frames в целом. – Jthorpe

5

Поскольку у вас есть много данных, рассмотреть возможность использования LOAD DATA. Это самый быстрый способ импорта данных из файла в соответствии с документами mysql.

LOAD DATA INFILE
Оператор INFILE DATA НАГРУЗКИ читает строки из текстового файла в таблицу на очень высокой скорости.

Speed of INSERT Statements
При загрузке таблицы из текстового файла используйте LOAD DATA INFILE. Это обычно в 20 раз быстрее, чем с помощью инструкций INSERT. См. Раздел 13.2.6, «Синтаксис загрузки данных».
...
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, вот функция, которая загружает data.frame в MySQL с помощью LOAD DATA INFILE:

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) 
} 
Смежные вопросы