我正在对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.
[原帖]
我已经看到了几个类似的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)
我尝试了以下内容,但没有一个有效.
我在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) 在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.
我正在尝试从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) 我正在运行需要 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 执行上述操作确实有效。
继此问题和随后的答案之后: 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 在数据库中强加条件时,这不起作用。我想另一件事是写一个任意大的数字。
我正在尝试设置并行任务,每个工作人员都需要进行数据库查询.我正在尝试使用这个问题中的连接设置每个工作者,但每次我尝试它都会返回<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电脑
我在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) 我正在尝试使用该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) 我正在尝试使用 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) r ×10
rpostgresql ×10
postgresql ×3
ssl ×2
data.table ×1
database ×1
doparallel ×1
foreach ×1
libpq ×1
odbc ×1
posixct ×1
r-dbi ×1
reshape2 ×1
rodbc ×1
rstudio ×1
tidyr ×1
windows ×1