2013-10-13 73 views
1

我得到的錯誤後,我成立了MonetDB,並嘗試寫一個大data.frame作爲缺省數據庫中的新表(演示):從MonetDB.R包的dbWriteTable的`.local(conn,statement,...)'錯誤是什麼原因?

>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

嗨,'MonetDBLite'(在CRAN上)現在取代了'MonetDB.R'並運行嵌入式(如'RSQLite')。有關更多詳細信息,請參閱https://github.com/hannesmuehleisen/MonetDBLite/blob/master/README.md –

回答

2

這可能是超時問題(dbConnect()的參數)。如果您想調試,可以在連接前運行

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

。如果你在這裏發佈輸出,我可以給你一個更好的想法,可能會出錯。最後,你有沒有試過看下面的輸出

dbGetException(conn) 

UPDATE:

很抱歉的是,這樣做的原因是,dbWriteTable使用字符數據錯誤的SQL類型。目前,使用了一個VARCHAR(255),它確實限制在255個字符之內。它應該使用的是STRING,它沒有限制。它被稱爲一個錯誤,並將在下一個版本中修復。由於這可能需要一段時間,這裏是一個解決辦法:如果你從源代碼安裝,你可以通過在SRC/monetdb.R改變

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。 R-forge版本也將很快更新,尋找版本0.8.1在https://r-forge.r-project.org/R/?group_id=1534

+0

謝謝@Hannes,錯誤不再出現。不過,現在有一個新的錯誤: '$差錯編號 [1] 42000 $ ERRMSG [1] 「語法錯誤,意想不到的IDENT,預計 ')' 或 '' 在:\」 插入table1的值([......] \「」' – Nima

+0

@Nima,你能分享R腳本和數據文件嗎?我可以看看... –

+0

恐怕我不能保密數據。到現在RSQLite,但會盡快與MonetDB進行檢查。無論如何,謝謝! – Nima