在设置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创建表时以交互方式设置上限?
答案 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