使用 RJDBC 连接 R 和 Netezza
Posted
技术标签:
【中文标题】使用 RJDBC 连接 R 和 Netezza【英文标题】:Connect R and Netezza using RJDBC 【发布时间】:2014-03-10 14:06:25 【问题描述】:我正在尝试使用 JDBC 驱动程序将 R 与 Netezza 连接起来。
我成功连接数据库,但结果不正确。
# Here are the connection details
library(RJDBC)
drv <- JDBC(driverClass="org.netezza.Driver", classPath = "C://JDBC//nzjdbc.jar", "'")
con <- dbConnect(drv, "jdbc:netezza://10.206.0.66:5480//DBASE", "USER", "PASS")
# > con
# An object of class "JDBCConnection"
# Slot "jc":
# [1] "Java-Objectorg.netezza.sql.NzConnection@bce3d7"
# Slot "identifier.quote":
# [1] "'"
res <- dbSendQuery(con, "SELECT * FROM DBASE.MARBEL.DATOS limit 10000;")
res <- fetch(res, n = -1)
问题是这些字段被返回为带有“垂直”变量的列表,而不是表格的列!
head(res)
SUBSCRIPTION_ID
1 245206318120314
2 235109338101206
3 238463669110624
4 214177015090830
5 212403495090830
6 13874138618090824
SUB_ACCOUNT_ID
1 MV_SUBCTA_45206318_20120316
2 MV_SUBCTA_35109338_20101207
3 MV_SUBCTA_38463669_20110627
4 MV_SUBCTA_45223848_20120316
5 MV_SUBCTA_12403495_20081224
6 MV_SUBCTA_18932919_20091012
ACCOUNT_ID
1 MV_CTA_44123765_20120316
2 MV_CTA_35213277_20101207
3 MV_CTA_37772612_20110627
4 MV_CTA_14217213_20090330
5 MV_CTA_12477560_20081224
6 MV_CTA_18758944_20091012
ACCESS_METHOD_ID
1 1167391804
2 1159354610
3 2966407995
4 1153360304
5 1131960835
6 3874138618
知道如何解决这个问题吗?我有一个有效的 ODBC 连接,但我宁愿使用 JDBC。
【问题讨论】:
你是怎么得到“res”的?你能发布缺少的代码+表定义吗? 我已经添加了缺失的内容。该表有 70 列不同的数据类型。由于输出的格式,在 SO 中复制粘贴需要几页。由于我经常成功地将 RJDBC 与 Teradata 一起使用,因此 R 连接到 netezza 的方式似乎存在问题。 【参考方案1】:我将您的输出一直滚动到右侧,看起来您列中的字符串非常宽(它们是 CHAR 而不是 VARCHAR?),因此结果不适合 R 控制台的宽度。因此 R 以这种方式显示它们。
所以尝试在您的查询中修剪它们
select rtrim(SUB_ACCOUNT_ID), ...
或在 R 中:
require('stringr')
res$SUB_ACCOUNT_ID <- str_trim(res$SUB_ACCOUNT_ID)
【讨论】:
【参考方案2】:根据 Alex 的回答,我编写了这个函数以在所有变量中使用 rtrim。
query_nzz <- function(con, select="select * ", from="", where = "", limit = " 10000; ")
options(scipen=666)
# Get variable Names
query_names = paste(select, " from ",from, where, sep = " ")
names <- dbGetQuery(con, paste(query_names,"limit 1;", sep= " "))
names <- names(names)
# Trim spaces
select <- paste0("trim(",names,") as ", names, collapse = ",")
query = paste0("select ", select, " from ", from, where, " limit ",deparse(limit),";")
data = dbGetQuery(con, query)
data
函数使用
dt <- query_nzz(
con,
select = "select * ",
from = "DATABASE.TABLENAME",
where = "",
limit = 100000
)
【讨论】:
试试paste0('trim(', names, ') as ', names, collapse = ', ')
,而不是循环。以上是关于使用 RJDBC 连接 R 和 Netezza的主要内容,如果未能解决你的问题,请参考以下文章
R RJDBC java.lang.OutOfMemoryError