Пакетное выполнение запроса в RPostgres, возвращающее те же данные

В настоящее время я пытаюсь загрузить большую базу данных с помощью RPostgres, однако, когда я пытаюсь записать результаты в csv в пакетном режиме, он записывает одни и те же данные снова и снова (всегда первые 1M записей). Вот код, который я сейчас использую:

      wrds <- dbConnect(Postgres(),
                  host='wrds-pgdata.wharton.upenn.edu',
                  port=9737,
                  dbname='wrds',
                  sslmode='require',
                  user='username')

res <- dbSendQuery(wrds, "SELECT VARNAMES FROM DATABASE WHERE CONDITIONS")
i = 0

while (!dbHasCompleted(res)) {
  i <- i+1
  chunk <- dbFetch(res, 1000000) # Fetch 1,000,000 at a time
  filename <- paste("path\\EuropeanSMEs_", i)
  write.csv(data, filename, row.names = FALSE)
}

dbClearResult(res)
dbDisconnect(wrds)

Как изменить код, чтобы он извлекал новый набор из 1 млн строк на каждой итерации?

1 ответ

Я не думаю, что есть простой способ сделать это. С использованиемPROC EXPORTиз SAS будет работать (затем вам нужно будет загрузить.csvфайл из WRDS). Если бы мне действительно нужен был файл CSV с большим набором данных WRDS, я мог бы адаптировать свою функцию для записи в локальный файл CSV, а не в базу данных PostgreSQL.

Другой вариант — найти переменную, которая примерно разбивает данные на миллион строк. Например,yearили аналогичный и используйтеWHEREчасть SQL для получения строк по частям. С использованиемdbplyr(см. примеры здесь , возможно, вы могли бы написать небольшую функцию дляcollect()данные по году или какой-либо другой переменной разделения и записать в CSV.

Другие вопросы по тегам