".local(conn, statement, ...)中的错误"的原因可能是什么' in dbWriteTable from Package MonetDB.R?



我设置 MonetDB 并尝试在默认数据库中将大型 data.frame 作为新表写入后,我收到错误(演示):

>dbWriteTable(conn, "table1", df)
Error in .local(conn, statement, ...) : 
   Unable to execute statement 'INSERT INTO table1 VALUES([...])

数据帧具有以下尺寸:

>dim(df)
[1] 148767    618

并将所有列格式化为字符:

>all(lapply(df,class)=='character')
[1] TRUE

该错误似乎源于字符串值太长(感谢@Hannes Mühleisen):

>dbGetException(conn)
$errNum
[1] 22001
$errMsg
[1] "value too long for type (var)char(255)"

MonetDB 如何设置新 (VAR)CHAR 变量的上限(我在文档中没有找到任何关于上限的信息)?通过 MonetDB.R 从 R 创建表时,是否可以设置全局上限,或者是否可以交互设置上限?

这可能是一个超时问题(dbConnect()的参数)。如果要调试,可以运行

assignInNamespace("DEBUG_IO",TRUE,"MonetDB.R")

在连接之前。如果您在此处发布输出,我可以让您更好地了解可能出现的问题。最后,您是否尝试过查看输出

dbGetException(conn)

更新:

很抱歉,原因是 dbWriteTable 对字符数据使用了错误的 SQL 类型。目前,使用的是 VARCHAR(255),实际上限制为 255 个字符。它应该使用的是 STRING,它没有限制。它被标记为一个错误,并将在下一个版本中修复。由于这可能需要一段时间,因此这里有一个解决方法:如果您从源代码安装,您可以通过更改

setMethod("dbDataType", signature(dbObj="MonetDBConnection", obj = "ANY"), def=function(dbObj, obj, ...) {
        if (is.logical(obj)) "BOOLEAN"
        else if (is.integer(obj)) "INTEGER"
        else if (is.numeric(obj)) "DOUBLE PRECISION"
        else if (is.raw(obj)) "BLOB"
        else "VARCHAR(255)"
    }, valueClass = "character")

setMethod("dbDataType", signature(dbObj="MonetDBConnection", obj = "ANY"), def=function(dbObj, obj, ...) {
        if (is.logical(obj)) "BOOLEAN"
        else if (is.integer(obj)) "INTEGER"
        else if (is.numeric(obj)) "DOUBLE PRECISION"
        else if (is.raw(obj)) "BLOB"
        else "STRING"
    }, valueClass = "character")

在 src/monetdb 中。R 在使用 R CMD INSTALL 安装包之前。R-forge 版本也将很快更新,请在 https://r-forge.r-project.org/R/?group_id=1534 查找 0.8.1 版

最新更新