R Тип данных RpostgreSQL bigint

Мне нужно иметь дело с, я полагаю, большими значениями первичного ключа int 1380742793415240. В R я могу легко настроить параметр (scipen = 100), но мне нужно сохранить эти данные в базе данных postgres. Я уже пытался использовать dbWriteTable по умолчанию (двойная точность) с результатом: нарушение константы (вероятно, дублирующиеся ключи в представлении ... 4e+015), а также после изменения целевого столбца на bigint с результатом: invalid input syntax for integer: "1.38074279341524e+015".

пример: попробуйте сохранить и загрузить из БД после DT

sample_dt <- data.table(a = c(20130101,20130102,20130102), 
                        b = c(1380742793415240,1380742793415241,1380742793415242))

Каков эффективный способ сохранения и загрузки таких данных в postgres?


person jangorecki    schedule 03.10.2013    source источник
comment
Сохранить как персонажа? (Это options', и мне интересно, действительно ли options(scipen=100) делает то, что вы думаете.) .Machine$integer.max < 1380742793415240 [1] TRUE   -  person IRTFM    schedule 04.10.2013
comment
Используя символьное поле для этого, я не смог бы эффективно запросить sql <- paste0("select * from tbl where b >= '",one_id,"'"). Не все идентификаторы начинаются с 138..., чтобы справиться с этим случаем, мне нужно было бы заполнить начальные пробелы нулями, чтобы все строки имели один и тот же nchar. Нет ли более элегантного решения для хранения таких чисел, как 212982,1380742793415240, в качестве столбца первичного ключа и эффективного запроса к ним с помощью оператора >???   -  person jangorecki    schedule 04.10.2013
comment
Я действительно не знаю. Я знаю, что предложенный вами ключ не соответствует ограничениям целочисленного режима R.   -  person IRTFM    schedule 04.10.2013


Ответы (1)


Эта тема была хорошо обсуждена и решена в списке рассылки RpostgreSQL со ссылкой на нее, если у кого-то возникнет такая же проблема: https://groups.google.com/forum/#!topic/rpostgresql-dev/NDc7NfUP6M8
Под содержимым:

library(RPostgreSQL)
# Loading required package: DBI
c=dbConnect("PostgreSQL")
a <- 1380742793415240
b <- 1380742793415241
dc <-data.frame(a=as.character(a), b=as.character(b))
dbWriteTable(c,"testclosenumberch", dc)
# [1] TRUE
dbGetQuery(c, "select * from testclosenumberch")
#   row.names                a                b
# 1         1 1380742793415240 1380742793415241
dbGetQuery(c, "select a::bigint - b::bigint  from testclosenumberch")
#   ?column?
# 1       -1
person jangorecki    schedule 04.10.2013