标签: rpostgresql

是否可以从PostgreSQL读取data.table?

我正在对PostgreSQL数据库中存储的大量数据进行一些分析.出于速度和内存的原因,我正在使用该data.table软件包.目前我这样做是为了阅读数据.

library(RPostgreSQL)
library(data.table)
...
query <- "SELECT * FROM eqtl"
data <- as.data.table(dbGetQuery(con, query))
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来做到这一点,不涉及将整个事物读入a data.frame然后将其复制到一个data.table.

r rpostgresql data.table

8
推荐指数
1
解决办法
1624
查看次数

在Mac 10.11.3上使用RPostgreSQL将R连接到Redshift

[原帖]

我已经看到了几个类似的SO问题,但我认为它们中的任何一个都与操作系统无关.

长话短说,这是我在尝试建立与Redshift的ssl连接时看到的.

library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv,
                 host = "XXXXXXXX.us-east-1.redshift.amazonaws.com",
                 port = 5439,
                 user = "XXXXXXXX",
                 password = "XXXXXXXX",
                 dbname = "db1")

> Error in postgresqlNewConnection(drv, ...) : 
    RS-DBI driver: (could not connect XXXXXXXX@XXXXXXXX.us-east-1.redshift.amazonaws.com on dbname "db1")
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容,但没有一个有效.

  1. 使用R通过SSL连接到Redshift
  2. 将文件从PostgreSQL导入R
  3. 使用R通过SSL连接到Postgres
  4. https://groups.google.com/forum/#!topic/rpostgresql-dev/ELnVUJqjDbk

我在AWS中有一个EC2节点(Ubuntu),在办公室有另一个Mac Pro,所以我尝试使用相同的代码从两者连接.

Linux系统可以复制和粘贴完全相同的代码.这是Sys.info()Linux服务器上的:

sysname                                              Linux
release                                  3.13.0-48-generic
version        #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
nodename                                   ip-xx-xxx-xx-xx
machine                                             x86_64
login                                              unknown
user                                                  bcui
effective_user                                        bcui
Run Code Online (Sandbox Code Playgroud)

但是,Mac Pro失败并显示完全相同的错误消息.这是Mac Sys.info()(与我的Mac笔记本电脑相同):

sysname …
Run Code Online (Sandbox Code Playgroud)

ssl r rpostgresql amazon-redshift

8
推荐指数
1
解决办法
1511
查看次数

在R DBI中将参数传递给查询的正确方法

在perl/python中,DBI API有一种机制可以在参数中安全地插入sql查询.例如在python中我会这样做:

cursor.execute("SELECT * FROM table WHERE value > ?", (5,))    
Run Code Online (Sandbox Code Playgroud)

其中execute方法的第二个参数是要添加到sql查询中的参数元组

R的DBI兼容API是否有类似的机制?我见过的例子从未显示传递给查询的参数.如果不是,在参数中插入查询最安全的方法是什么?我特意看着使用RPostgresSQL.

r rpostgresql r-dbi

8
推荐指数
2
解决办法
1811
查看次数

在使用RPostgreSQL提取数据时,是否有一种特定的方法来处理R中的时间戳列?

我正在尝试从PostgreSQL数据库中提取数据,并且时间戳字段的结果不一致.我不确定我是否正确处理POSIXct结果.否则,我想我在RPostgreSQL包中发现了一个错误.以下是复制问题的方法:

假设postgres数据库中有一个表有一个字段(在PostgreSQL中运行):

CREATE DATABASE mydb;
CREATE TABLE test_table
(   
  "DateTime" timestamp without time zone NOT NULL,
  CONSTRAINT "pk_test_table" PRIMARY KEY ("DateTime")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE test_table
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

让我们说有几百条记录.我将在R中填充它们.这是代码:

library(RPostgreSQL)

# Let's feed the table with some sequence of date/time values
date_values <-  as.chron(seq(10000, 10500, 1/24))

format.chron <- function(z)  {
  sprintf("%04.0f-%02.0f-%02.0f %02.0f:%02.0f:00", 
            as.numeric(as.character(years(z))), 
            months(z), 
            as.numeric(as.character(days(z))), 
            as.numeric(as.character(hours(z))), 
            as.numeric(as.character(minutes(z))))
}

.generateInsertQuery <- function(date_values, field_name, table_name) {
  insert_val  <- paste(paste0("(", sQuote(format(date_values)), ")"), collapse=',')
  qry         <- paste("INSERT INTO", dQuote(table_name), paste0("(", …
Run Code Online (Sandbox Code Playgroud)

r posixct rpostgresql

7
推荐指数
2
解决办法
2715
查看次数

无法使用 SSL 创建到 Postgres 的 dbConnect

我正在运行需要 SSL 的 Postgres-9.4 服务器。当我使用 pgadmin 或 windows odbc 连接从我的笔记本电脑连接到 Postgres 服务器时,它可以使用 SSL。但是,当我尝试使用 SSL 连接 R 时,它失败了。

library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, 
                 user = "postgres", 
                 password = mypasswd, 
                 dbname = "dbname=postgres sslmode=prefer",
                 host = "192.168.1.179")
Run Code Online (Sandbox Code Playgroud)

如果我将 pg_hba.conf 设置为允许非 ssl 连接,那么这将起作用。当我将它设置为只允许 SSL 连接时,这将失败。不幸的dbConnect是没有verbose选择所以我什么也得不到could not connect postgres@192.168.1.179 on dbname "postgres"

我发现这个问题似乎表明我在做正确的事情,但是,不行。

编辑:

我做了更多的挖掘,发现这个讨论表明由于各种库/dll问题,这在 Windows 上不起作用。那个讨论在这一点上已经有几年了,所以也许它已经解决了。我可以确认从 linux 执行上述操作确实有效。

windows r libpq rpostgresql

7
推荐指数
1
解决办法
1686
查看次数

PostgreSQL 数字类型是否支持无穷大(和 -infinity)?

继此问题和随后的答案之后: Postgres 中 -Infinity 和 Infinity 的适当值

和文档,似乎很清楚real和double precision数字类型支持正无穷大和负无穷大。但是,没有提及numeric类型,只是range有“无限制”。

类型是否支持正无穷大和负无穷大numeric(在 PostgreSQL 9.5 中),如果是,如何插入这些值?

编辑(如@TimBiegeleisen 所建议):发生这种情况的原因是我试图将数字列从R数据库表中写入。该列包含Inf值,但使用dbWriteTablefromRPostgreSQL错误:

Error in postgresqlgetResult(new.con) : 
  RS-DBI driver: (could not Retrieve the result : 
ERROR:  invalid input syntax for type numeric: "Inf"
Run Code Online (Sandbox Code Playgroud)

在我的特殊情况下,我可以将这些值转换Inf为NA并将其写为NULL,但是当列包含缺失值或not null 在数据库中强加条件时,这不起作用。我想另一件事是写一个任意大的数字。

postgresql r rpostgresql

7
推荐指数
2
解决办法
6660
查看次数

一旦使用doParallel clusterEvalQ启动RPostgreSQL连接就会过期

我正在尝试设置并行任务,每个工作人员都需要进行数据库查询.我正在尝试使用这个问题中的连接设置每个工作者,但每次我尝试它都会返回<Expired PostgreSQLConnection:(2781,0)>我注册的许多工作人员.

这是我的代码:

cl <- makeCluster(detectCores())
registerDoParallel(cl)

clusterEvalQ(cl, {
  library(RPostgreSQL)
  drv<-dbDriver("PostgreSQL")
  con<-dbConnect(drv, user="user", password="password", dbname="ISO",host="localhost")

})
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行我foreach尽管错误,它失败了task 1 failed - "expired PostgreSQLConnection"

当我进入postgres服务器状态时,它会显示已创建的所有活动会话.

我从主R实例中与postgres交互没有任何问题.

如果我跑

clusterEvalQ(cl, {
  library(RPostgreSQL)
  drv<-dbDriver("PostgreSQL")
  con<-dbConnect(drv, user="user", password="password", dbname="ISO",host="localhost")
  dbGetQuery(con, "select inet_client_port()")

})
Run Code Online (Sandbox Code Playgroud)

然后它将返回所有客户端端口.它没有给我过期通知但是如果我尝试运行我的foreach命令它将失败并出现相同的错误.

编辑:

我在Ubuntu和2台Windows电脑上试过这个,它们都给出了同样的错误.

另一个编辑:

现在3台Windows电脑

foreach r rpostgresql doparallel

6
推荐指数
1
解决办法
1579
查看次数

如何在postgreSQL(Redshift)数据库中的"大"数据上使用tidyr(或类似数据争论)

我在12节点红移群集中有40亿行数据.我成功地使用Rpostgreqsql包连接到它并使用dplyr进行基本数据争用.

但是,我想做一些数据重塑,我通常使用reshape2(dcast)或tidyr(spread)来做.我发现我的数据库对象上都没有执行包.我可以运行"收集",但这会有问题,因为数据帧太大而无法放入内存(因此我想在DB中运行).我的总体目标是使用dcast/spread来扩大数据范围,同时在此过程中创建0/1标记.这就像我的机器上的小数据样本的魅力,但在数据库上不太好.

下面是我工作的代码.连接到DB并使用dplyr进行基本过滤.当我尝试使用tidyr/reshape2时,R抛出"类型无法识别"的语法错误

    Redshift <- src_postgres('dev',
                         host = 'xxx.aws.com',
                         port = 5439,
                         user = "user", 
                         password = "pwd")


### create table reference ###
df <- tbl(Redshift, "df_cj_allact")

# simple and default R commands analyzing data frames
dim(df)
colnames(df)
head(df)

df2 <- df %>% filter(id != '0') %>% arrange(id, timestamp, category)  # seems to work!
# 2157398, was 2306109 (6% loss)
Run Code Online (Sandbox Code Playgroud)

postgresql r reshape2 rpostgresql tidyr

6
推荐指数
1
解决办法
472
查看次数

R RPostgreSQL使用SSL连接到远程Postgres数据库

我正在尝试使用该RPostgreSQL包从R内部连接到远程PostgreSQL数据库,并且我收到的错误似乎与连接的SSL设置有关.我已经验证我可以使用命令行连接psql,所以我知道连接是有效的并且可以从我的计算机访问.

我在R中连接的第一次尝试是以下(其中<MyHost>,并<MyPass>得到适当填写我的连接):

library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='warehouse', 
                 user='warehouse', password=<MyPass>, port=5432 )
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

RS-DBI driver: (could not connect warehouse@<MyHost>.com:5432 on 
dbname "warehouse": FATAL:  no pg_hba.conf entry for host "75.166.243.177", 
user "warehouse", database "warehouse", SSL off
Run Code Online (Sandbox Code Playgroud)

我理解这意味着我需要对我的连接应用SSL加密,所以我尝试了以下,这似乎适用于OP:使用R通过SSL连接到Postgres

library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='dbname=warehouse sslmode=require', 
                 user='warehouse', password=<MyPass>, port=5432 )
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

RS-DBI driver: (could not connect warehouse@<MyHost>:5432 on dbname 
"warehouse": sslmode value …
Run Code Online (Sandbox Code Playgroud)

database postgresql ssl r rpostgresql

6
推荐指数
1
解决办法
1328
查看次数

R 和 RStudio 未检测到已安装的 PostgreSQL(或任何其他)ODBC 驱动程序

我正在尝试使用 RStudio 中的 R ODBC 驱动程序连接到 PostgreSQL 数据库。出于某种原因,R 没有检测到驱动程序:

$ Rscript -e 'odbc::odbcListDrivers()'
[1] name      attribute value    
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

尽管据我所知,它们已正确安装(使用自制软件):

$ brew list
freetds     gettext     git     icu4c       libtool     openssl     pcre2       pkg-config  
postgresql  psqlodbc    readline    sqlite      sqliteodbc  unixodbc

$ odbcinst -j
unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/barthf/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

$ cat /etc/odbcinst.ini
[PostgreSQL Driver]
Driver          = /usr/local/lib/psqlodbcw.so

[SQLite Driver]
Driver          = …
Run Code Online (Sandbox Code Playgroud)

odbc r rodbc rstudio rpostgresql

6
推荐指数
1
解决办法
1764
查看次数