Ошибка записи Dataframe из R в Redshift - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть фрейм данных в R с различными типами данных.При записи фрейма данных с R на сервер красного смещения я получаю сообщение об ошибке только со значениями символа и метки времени.Я добавляю фрагмент кода R ниже, чтобы дать вам более полное представление о проблеме.

library(lubridate)
library(dplyr)

dat <- data.frame(id = letters[1:2], x = 2:3, date = now())
dat
str(dat)

drv <- dbDriver("PostgreSQL")
conn <- dbConnect(drv, host="redshift.amazonaws.com", port="5439", dbname="abcd", user="xyz", password="abc")

DBI::dbGetQuery(conn, "DROP TABLE test21;")
DBI::dbGetQuery(conn, "CREATE TABLE test21 ( id VARCHAR(255), x INT, date timestamp);")

chunksize = 100 

for (i in 1:ceiling(nrow(dat)/chunksize)) { 
query = paste0('INSERT INTO test21 (',paste0(colnames(dat),collapse = ','),') VALUES ')
  vals = NULL
  for (j in 1:chunksize) {
    k = (i-1)*chunksize+j
    if (k <= nrow(dat)) {
      vals[j] = paste0('(', paste0(dat[k,],collapse = ','), ')')
    }
  }
  query = paste0(query, paste0(vals,collapse=','))
  DBI::dbExecute(conn, query)
}

Во время выполнения последней части появляется следующее сообщение об ошибке:

  RS-DBI driver: (could not Retrieve the result : ERROR:  column "date" is of type timestamp without time zone but expression is of type numeric
HINT:  You will need to rewrite or cast the expression.

Когда я вручнуюввел значения в таблицу красных смещений, все получилось, как и ожидалось.

DBI::dbGetQuery(conn, "INSERT INTO test21 (id, x, date) values ('a','2','2019-02-08 15:21:08'),('b','3','2019-02-08 15:21:08')")

Я чувствую, что эта проблема вызвана некоторой программной ошибкой.запрашиваю ваш совет относительно того же, где я делаю неправильно с кодом.

1 Ответ

0 голосов
/ 08 февраля 2019

В поле даты вашего фрейма данных попробуйте заменить

now()

на

substr(now(), 1, 19)

...