在包MonetDB.R的dbWriteTable中,.local(conn,statement,...)中的错误可能是什么原因?

时间:2013-10-13 10:25:09

标签: r monetdb

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

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

data.frame有尺寸:

>dim(df)
[1] 148767    618

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

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

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

>dbGetException(conn)
$errNum
[1] 22001

$errMsg
[1] "value too long for type (var)char(255)"

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

1 个答案:

答案 0 :(得分:2)

可能是超时问题(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")
在使用R CMD INSTALL安装软件包之前,在src / monetdb.R中

。 R-forge版本也将很快更新,在https://r-forge.r-project.org/R/?group_id=1534

查找版本0.8.1