在运行RJDBC 0.2-4的dbGetQuery时出现以下错误:
Error in .jcall(rp, "I", "fetch", stride) :
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
以下是我的代码:
Sys.setenv(JAVA_HOME='C:/Program Files (x86)/Java/jdk1.7.0_25')
options(java.parameters='-Xmx1g')
library(rJava)
library(rjson)
library(RJDBC)
# Output Java version
.jinit()
print(.jcall("java/lang/System", "S", "getProperty", "java.version"))
jdbcDriver <<- JDBC(driverClass="oracle.jdbc.OracleDriver", classPath="C:/lib/dashboard_lib/ojdbc6.jar")
jdbcConnection <<- dbConnect(jdbcDriver, "...", "...", "...")
dataset <<- dbGetQuery(jdbcConnection, "select * from OPR_DATA.MV_REG_CTRY_MS_QUARTER_AMT")
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我,非常感谢提前
我正在尝试从Mac/Linux上的R连接到Microsoft SQL Server,我遇到RJDBC问题.当我下载了Microsoft的驱动程序和JTDS时,但以下所有行都不起作用:
library(RJDBC)
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver",
"/Users/victor/Downloads/sqljdbc_3.0/enu/sqljdbc4.jar")
drv1 <- JDBC('net.sourceforge.jtds.jdbc.Driver',
"/Users/victor/Downloads/jtds-1/jtds-1.3.0.jar")
Run Code Online (Sandbox Code Playgroud)
每一个都返回以下错误消息:
Error in .jfindClass(as.character(driverClass)[1]) : class not found
Run Code Online (Sandbox Code Playgroud)
我怀疑问题可能是错误的Java版本:我的默认java是
$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
Run Code Online (Sandbox Code Playgroud)
但是我的机器上也安装了Jave 1.6.我安装了SquirrelSQL并使用JTDS驱动程序连接到MS SQL Server没有任何问题; SquirrelSQL运行的Java版本是1.7.0.11.
我运行R CMD javareconf了以下结果:
$ R CMD javareconf
Java interpreter : /usr/bin/java
Java version : 1.7.0_11
Java home path : /Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home/jre
Java compiler : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: …Run Code Online (Sandbox Code Playgroud) 我想了解(重新)通过RJDBC使用SQL连接到MS SQL数据库的最佳实践.
我可以想象三种可能的情况:
我在一个有几十个客户端的闪亮应用程序中使用我的代码,如果我使用方法1,我担心会发生一些不好的事情.所以我使用方法2,使用下面的代码为每个请求创建一个新连接.
我可以看到这种方法的一些潜在缺点:性能,对数据库资源征税等等.但是,由于R是单线程的,即使在闪亮的使用场景中,我可能会过于谨慎吗?
所以我的具体问题是:
A.在我的闪亮应用程序中,我可以通过RJDBC安全地使用单个连接到MS SQL数据库吗?
B.上述方案2中是否存在任何真正的缺点(内存泄漏,性能等)?
NewConnection <- function() {
file = NULL
# make it work on three different OSes - Linux, MacOS, Windows
for (path in c('/Users/victor/Documents/R/sqljdbc_3.0/enu/sqljdbc4.jar',
'/home/oracle/sqljdbc_3.0/enu/sqljdbc4.jar',
'C:/Projects/jdbc/sqljdbc_4.0/enu/sqljdbc4.jar')) {
if (file.exists(path)) {
file = path
break
}
}
if (is.null(file))
return(NULL)
else {
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", file)
passwd <- GetUserNamePassword()
conn <- dbConnect(drv, "jdbc:sqlserver://sql.server.address.com",
passwd$username, passwd$password)
return(conn)
}
}
Run Code Online (Sandbox Code Playgroud)
PS相关:如何管理R包中的数据库连接
我试图用平行运行我的查询,我得到一个00001: Error in .jcheck() : No running JVM detected. Maybe .jinit() would help.错误.当我逐个运行查询时,查询正在运行
我的剧本:
我知道它不是真正的可再现但我不能给你我的日志/通行证:)
我试图.jinit()和Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jdk1.8.0_102')在从它不工作
library(RJDBC)
library(parallelemap)
jdbcDriver <- JDBC(driverClass="oracle.jdbc.OracleDriver", classPath="ojdbc6.jar" )
jdbcConnection <- dbConnect(jdbcDriver, "jdbc:oracle:thin:@//mybase", "login", "pass")
query_list<- list( "SELECT * FROM table1",
"SELECT * FROM table2",
"SELECT * FROM table3",
"SELECT * FROM table4",
"SELECT * FROM table5")
import_base_fonction <- function(query) {return(dbGetQuery( jdbcConnection , query))}
parallelStartSocket( 5 )
parallelLibrary("RJDBC","rJava")
parallelExport("listquery_list","import_base_fonction" ,"jdbcConnection")
mes_tables <- parallelMap(import_base_fonction,query_list)
parallelStop()
Run Code Online (Sandbox Code Playgroud)
我的会话信息
R version 3.4.1 (2017-06-30) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用RJDBC的dbWritetable以下列方式从R到SAP HANA编写一个大型数据集(10个字符串,100M记录)
library("RJDBC")
drv <- JDBC("com.sap.db.jdbc.Driver", "/data/hdbclient/ngdbc.jar", "'")
database <- dbConnect( drv,"jdbc:sap://servername", "USER", "PASS")
dbWriteTable(database, "largeSet", largeSet)
Run Code Online (Sandbox Code Playgroud)
这有效,但速度极慢(每小时75k记录).我也测试了RODBC(sqlsave),这显示了同样的问题.
看看dbWriteTable它背后的代码似乎是逐个记录(即与插入相同),并且确实使用逐行插入到使用中dbSendUpdate显示相同的性能.我已经验证问题不在于连接速度本身.
ROracle有一个bulk_write选项似乎可以解决这个问题,但由于我正在尝试写HANA,我需要RJDBC或RODBC.
谁能告诉我如何通过运行批量写入或其他方法来加快对HANA的写入?
我正在使用RJDBC查询R中的数据库.查询是根据从文件读入的数据构建的.这些查询可能会变得很长,并且可能包含不存在的列(导致错误).
下面是一个简化示例,它将文件作为输入,并从文件生成运行2查询.
table column drinks cost drinks sugar drinks volume food cost
SELECT column, cost, sugar FROM drinks;
SELECT cost FROM food;
Run Code Online (Sandbox Code Playgroud)
由于这些查询可能会变得很长,因此数据库中的任何错误通常会在有用信息之前被截断.我目前的一个错误是:
错误[2018-05-16 16:53:07]错误处理表data_baseline_biosamples为DAR-2018-00008原始错误消息:.verify.JDBC.result中的错误(r,"无法检索JDBC结果集",::Unable检索SELECT ed.studyid的JDBC结果集,{非常长的列列表},ct.nmr_xl_vldl_pl,ct.nmr_xl_
由于数据库错误包括密钥信息之前的整个查询,因此截断会删除有用的信息以解决问题.
在这种情况下,错误消息可能以这样的结尾:
(第1行,'littlefeltfangs'拥有的表'data_biosamples'不包含列'sample_source'.)
如何记录数据库发送的完整错误消息或以其他方式提取该消息的最后部分?
我在tryCatch中捕获错误并使用futile.logger将错误传递到日志文件中.截断时的总错误长度为8219个字符,其中8190个出现在数据库中.
我有一个hadoop的csv文件,我有一个Hive表,现在我想把csv文件加载到这个Hive表中
我用load LOAD DATA本地'path/to/csv/file'覆盖INTO TABLE tablename;
结果出现了这个错误:
Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", :
Unable to retrieve JDBC result set for LOAD DATA local
'path/to/csv/file' overwrite INTO TABLE tablename
(Error while processing statement: FAILED:
ParseException line 1:16 missing INPATH at ''path/tp csv/file'' near '<EOF>'
)
Run Code Online (Sandbox Code Playgroud)
注意:我正在尝试使用r中的RJDBC连接
我正在使用 RJDBC 包和 dbGetQuery 函数来获取 SQL 查询的输出。该代码适用于行数不多的 SQL 语句,但哪些语句的行 > 1.000.000 出现错误。是否有处理内存的参数?
dbGetQuery(conn,"SQL..")
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误消息:
.jcall(rp, "I", "fetch", stride, block) 中的错误:
java.lang.OutOfMemoryError:超出 GC 开销限制
谢谢!R007
建立作为解释连接后在这里,我试着写一个非常简单的数据帧(trythis如下所示),以一个名为表gh_test_20141105在一个名为数据库p_cia_t.首先,我试过了
> conn <- getTdConnection(vdm='vivaldi')
> dbWriteTable(conn=conn,name=tbl,value=trythis)
Error in .verify.JDBC.result(s, "Unable to execute JDBC prepared statement ", :
Unable to execute JDBC prepared statement INSERT INTO p_cia_t.gh_test_20141005 VALUES(?,?,?,?) ([Teradata Database] [TeraJDBC 14.10.00.17] [Error 3932] [SQLState 25000] Only an ET or null statement is legal after a DDL Statement.)
Run Code Online (Sandbox Code Playgroud)
接下来,我在Teradata中创建了一个空表:
create table p_cia_t.gh_test_20141105 (eenie integer, meenie integer, minie integer, moe integer);
我接下来的两次尝试编写此数据框的方式都是相互矛盾的:
> dbWriteTable(conn=conn,name=tbl,value=trythis,append=T)
Error in .local(conn, statement, ...) :
execute JDBC update …Run Code Online (Sandbox Code Playgroud) 使用 rJava 进行调用时,有没有办法以 R 中的字符向量捕获 java 写入控制台/标准输出的输出?有没有办法做到这一点,而不将java的stdout重定向到文件并让R读取文件?
在我的特定用例中,我使用 RJDBC 连接到数据库,服务器将发回打印到控制台的有用信息。我想解析这些消息,提取一些信息,并采取相应的行动。
当我进行运行 java 代码的函数调用时,任何控制台输出都会转发到 RStudio 控制台,但capture.output似乎不起作用(我type = "output"也尝试过)
rJava::.jinit()
jText <- capture.output(
rJava::J("java/lang/System")$out$println("Write this down"),
type = "message"
)
identical(jText, character(0))
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)
我可以通过将 java stdout 重定向到文件来做到这一点,但是有没有办法避免写入文件?例如,我可以这样提取 HAL 9000 正在与谁交谈:
rJava::.jinit()
jSys <- rJava::J("java/lang/System")
jOut <- tempfile(fileext = ".txt")
jOrigOut <- jSys$out
jPS <- rJava::.jnew("java/io/PrintStream", jOut)
jSys$setOut(jPS)
jSys$out$println("I'm sorry Dave. I'm afraid I can't do that")
jSys$setOut(jOrigOut)
msg <- readLines(jOut)
regmatches(msg, regexpr("(?<=I'm sorry ).*(?=\\.)", msg, perl …Run Code Online (Sandbox Code Playgroud)