我正在尝试使用 RJDBC 从 R 中连接到 SAS 驱动的远程数据库。我第一次执行 a 时dbConnect,出现错误:
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],
: java.lang.NoClassDefFoundError: com/sas/net/crypto/CryptoException
Run Code Online (Sandbox Code Playgroud)
当我dbConnect在第一次调用后第二次执行时,它连接正常,并且我返回一个 class 对象JDBCConnection。
我查看了sas.core.jar文件(来自最新的 94M2 SAS JDBC 驱动程序),并且可以看到其中CryptoException列出的内容。但是,我也很好奇为什么它试图抛出一个CryptoException.
问题 1:如何在第一次dbConnect调用时默默忽略错误?
问题 2:它为什么要尝试抛出CryptoException?我能做些什么来防止这种情况?(这可能会取消问题 1。)
我有一个带有16个内核和8Gb内存的R服务器,它初始化了一个本地SNOW集群,例如10个工作者.每个工作人员从Microsoft SQL服务器下载一系列数据集,将它们合并到某个键上,然后在将结果写入SQL服务器之前对数据集运行分析.worker和SQL Server之间的连接通过RJDBC连接运行.当多个工作程序从SQL服务器获取数据时,ram使用情况会爆炸,R服务器崩溃.
奇怪的是,与加载数据集的大小相比,加载数据的工作者使用ram的用法似乎不成比例地大.每个数据集包含大约8000行和6500列.当在磁盘上保存为R对象时,这将转换为大约20MB,在保存为逗号分隔文件时大约为160MB.然而,R会话的ram使用大约是2,3 GB.
以下是代码的概述(一些提高可读性的印刷更改):
使用RJDBC建立连接:
require("RJDBC")
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver","sqljdbc4.jar")
con <<- dbConnect(drv, "jdbc:sqlserver://<some.ip>","<username>","<pass>")
Run Code Online (Sandbox Code Playgroud)
在此之后,有一些代码将函数输入向量requestedDataSets与所有表的名称进行排序,以按记录数查询,这样我们就可以从最大到最小加载数据集:
nrow.to.merge <- rep(0, length(requestedDataSets))
for(d in 1:length(requestedDataSets)){
nrow.to.merge[d] <- dbGetQuery(con, paste0("select count(*) from",requestedDataSets[d]))[1,1]
}
merge.order <- order(nrow.to.merge,decreasing = T)
Run Code Online (Sandbox Code Playgroud)
然后我们通过requestedDatasets向量并加载和/或合并数据:
for(d in merge.order){
# force reconnect to SQL server
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver","sqljdbc4.jar")
try(dbDisconnect(con), silent = T)
con <<- dbConnect(drv, "jdbc:sqlserver://<some.ip>","<user>","<pass>")
# remove the to.merge object
rm(complete.data.to.merge)
# force garbage collection
gc()
jgc()
# ask database for dataset d
complete.data.to.merge <- dbGetQuery(con, …Run Code Online (Sandbox Code Playgroud) 我试图将R data.frame写入Netezza表。它有大约5.5万行,并且我将4GB设置为Java的内存限制(选项(java.parameters =“ -Xmx4096m”))
查询:
insert into MY_TABLE_NAME select * from external 'csv_file_containing_data_frame.csv' using (delim ',' remotesource 'jdbc');
Run Code Online (Sandbox Code Playgroud)
当我从诸如DbVisualizer之类的工具运行SQL时,上面的SQL 可以正常工作,但是当我尝试从RStudio运行它时出现以下错误。
R代码:
driver <- JDBC(driverClass="org.netezza.Driver", classPath = "drivers//nzjdbc.jar", "'")
connWrite <- dbConnect(driver, "jdbc:netezza://DB_SERVER:1234//DB_NAME", username, password)
str_insert_query <- paste(
"insert into MY_TABLE select * from external '", OutputFile , "' using (delim ',' remotesource 'jdbc');", sep = ""
dbSendQuery(connWrite, str_insert_query[1])
dbDisconnect(connWrite)
Run Code Online (Sandbox Code Playgroud)
错误信息:
Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", :
Unable to retrieve JDBC result set for …Run Code Online (Sandbox Code Playgroud) 我一直试图通过R从PostgreSQL数据库查询数据.我尝试用一些不同的软件包(RODBC, RJDBC, DBI, RPostgres等等)对猫进行换肤,但我似乎不断收到驱动程序错误.奇怪的是,我从来没有遇到过使用相同的驱动程序/ URL和设置从SQLWorkbench/J连接到Postgres的麻烦.
我已尝试使用postgresql-9.2-1002.jdbc4.jar和postgresql-9.3-1100.jdbc41.jar,以及"PostgreSQL"R中的通用驱动程序.两个jar文件分别是(i)我一直使用SQLWorkbench/J的驱动程序和(ii)相同驱动程序的稍新版本.然而,当我尝试使用它时......
drv_custom <- JDBC(driverClass = "org.postgresql.Driver", classPath="/Users/xxxx/postgresql-9.3-1100.jdbc41.jar")
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Error in .jfindClass(as.character(driverClass)[1]) : class not found
Run Code Online (Sandbox Code Playgroud)
好的,接下来我尝试使用通用驱动程序:
drv_generic <- dbDriver("PostgreSQL")
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它不希望我输入用户名:
>con <- dbConnect(drv=drv_generic, "jdbc:postgresql://xxx.xxxxx.com", port=xxxx, uid="xxxx", password="xxxx")
>Error in postgresqlNewConnection(drv, ...) : unused argument (uid = "xxxx")
Run Code Online (Sandbox Code Playgroud)
所以我没有用户/ uid尝试:
con < - dbConnect(drv_generic,"jdbc:postgresql://padb-01.jiwiredev.com:5439",password ="paraccel")
并得到一个错误....
Error in postgresqlNewConnection(drv, ...) :
RS-DBI driver: (could not connect jdbc:postgresql://padb-01.xxx.com:5439@local on dbname "jdbc:postgresql://xxxx.xxxx.com:5439")
Run Code Online (Sandbox Code Playgroud)
显然语法错了?
然后我回过头来尝试"自定义"驱动程序(前面的.jar文件之一),但没有指定driverClass.
drv_custom1 < - JDBC(classPath ="/ Users/xxxx/postgresql-9.2-1002.jdbc4.jar") …
我正在尝试使用RJDBC连接R和Teradata.
我发现这个链接有一个使用mysql的例子,但我不知道如何用teradata做同样的事情.
library(RJDBC)
drv <- JDBC("com.mysql.jdbc.Driver",
"/etc/jdbc/mysql-connector-java-3.1.14-bin.jar",
identifier.quote="`")
conn <- dbConnect(drv, "jdbc:mysql://localhost/test", "user", "pwd")
Run Code Online (Sandbox Code Playgroud)
我已经下载了这个驱动程序:http: //downloads.teradata.com/download/connectivity/jdbc-driver 但是我不确定我应该在哪里引用该目录.
我知道有一个teradataR包在那里,但我不知道它是否真的使用R 3.0.0工作.
目前我只是将数据从数据库中拉出来很有意思.简单的事情SELECT * FROM table.问题是RODBC很慢......
还有其他选择来完成这项任务吗?
当使用JDBC函数将R连接到amazon redshift时(我使用的是Windows 10),我收到以下错误:
Error in .jfindClass(as.character(driverClass)[1]) : class not found
Run Code Online (Sandbox Code Playgroud)
我正在运行的代码是
install.packages("rJava")
install.packages("RJDBC")
library(rJava)
library(RJDBC)
download.file('http://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC41-1.1.13.1013.jar','RedshiftJDBC41-1.1.13.1013.jar')
driver <- JDBC("com.amazon.redshift.jdbc41.Driver", "RedshiftJDBC41-1.1.13.1013.jar", identifier.quote = "`")
Run Code Online (Sandbox Code Playgroud)
为了获得有关错误的更多信息,我运行了这个:
.jclassLoader()$setDebug(1L)
Run Code Online (Sandbox Code Playgroud)
并且完整的错误跟踪是:
RJavaClassLoader: added 'RedshiftJDBC41-1.1.13.1013.jar' to the URL class path loader
RJavaClassLoader: adding Java archive file 'RedshiftJDBC41-1.1.13.1013.jar' to the internal class path
RJavaClassLoader: added 'C:/Users/user/Documents/R/win-library/3.2/RJDBC/java/RJDBC.jar' to the URL class path loader
RJavaClassLoader: adding Java archive file 'C:/Users/user/Documents/R/win-library/3.2/RJDBC/java/RJDBC.jar' to the internal class path
RJavaClassLoader@33909752.findClass(com.amazon.redshift.jdbc41.Driver)
- URL loader did not find it: java.lang.ClassNotFoundException: com.amazon.redshift.jdbc41.Driver
RJavaClassLoader.findClass("com.amazon.redshift.jdbc41.Driver")
- trying class …Run Code Online (Sandbox Code Playgroud) 我正在使用RJDBC 0.2-5连接到Rstudio中的Hive.我的服务器有hadoop-2.4.1和hive-0.14.我按照下面提到的步骤连接到Hive.
library(DBI)
library(rJava)
library(RJDBC)
.jinit(parameters="-DrJava.debug=true")
drv <- JDBC("org.apache.hadoop.hive.jdbc.HiveDriver",
c("/home/packages/hive/New folder3/commons-logging-1.1.3.jar",
"/home/packages/hive/New folder3/hive-jdbc-0.14.0.jar",
"/home/packages/hive/New folder3/hive-metastore-0.14.0.jar",
"/home/packages/hive/New folder3/hive-service-0.14.0.jar",
"/home/packages/hive/New folder3/libfb303-0.9.0.jar",
"/home/packages/hive/New folder3/libthrift-0.9.0.jar",
"/home/packages/hive/New folder3/log4j-1.2.16.jar",
"/home/packages/hive/New folder3/slf4j-api-1.7.5.jar",
"/home/packages/hive/New folder3/slf4j-log4j12-1.7.5.jar",
"/home/packages/hive/New folder3/hive-common-0.14.0.jar",
"/home/packages/hive/New folder3/hadoop-core-0.20.2.jar",
"/home/packages/hive/New folder3/hive-serde-0.14.0.jar",
"/home/packages/hive/New folder3/hadoop-common-2.4.1.jar"),
identifier.quote="`")
conHive <- dbConnect(drv, "jdbc:hive://myserver:10000/default",
"usr",
"pwd")
Run Code Online (Sandbox Code Playgroud)
但我总是收到以下错误:
.jcall中的错误(drv @ jdrv,"Ljava/sql/Connection;","connect",as.character(url)[1],:java.lang.NoClassDefFoundError:无法初始化类org.apache.hadoop.hive .conf.HiveConf $ ConfVars
即使我尝试使用不同版本的Hive jar,Hive-jdbc-standalone.jar但似乎没有任何工作..我也使用RHive连接到Hive,但也没有成功.
任何人都可以帮助我吗?..我有点卡住:(
r ×7
rjdbc ×7
java ×2
hadoop ×1
hive ×1
jdbc ×1
memory ×1
netezza ×1
postgresql ×1
rodbc ×1
sas ×1
sql-server ×1
teradata ×1
windows-10 ×1