1

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

>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

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

>dbGetException(conn)
$errNum
[1] 22001

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

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

4

1 回答 1

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

于 2013-10-13T11:12:01.857 回答