我在R中使用MonetDBLite创建了一个大型数据库,现在我想访问R之外的数据库(例如,使用通用数据库GUI).
有没有办法做到这一点?我不想复制数据,因为我仍然希望通过R访问它.我不需要从R和SQL GUI同时访问数据库,但我想根据需要在两者之间切换.
这是MonetDBLite数据库文件中的mtcars数据。
library(MonetDBLite)
library(tidyverse)
library(DBI)
dbdir <- getwd()
con <- dbConnect(MonetDBLite::MonetDBLite(), dbdir)
dbWriteTable(conn = con, name = "mtcars_1", value = mtcars)
data_mt <- con %>% tbl("mtcars_1")
Run Code Online (Sandbox Code Playgroud)
我想使用dplyr mutate创建新变量并将其添加(提交!)到数据库表中吗?就像是
data_mt %>% select(mpg, cyl) %>% mutate(var = mpg/cyl) %>% dbCommit(con)
Run Code Online (Sandbox Code Playgroud)
这样做时,所需的输出应该相同:
dbSendQuery(con, "ALTER TABLE mtcars_1 ADD COLUMN var DOUBLE PRECISION")
dbSendQuery(con, "UPDATE mtcars_1 SET var=mpg/cyl")
Run Code Online (Sandbox Code Playgroud)
那怎么办
我正在尝试使用R + MonetDB作为大数据分析堆栈,但是在创建新列并使用我的分析数据填充它时遇到了问题.这是一个玩具示例:
library(MonetDBLite)
library(DBI)
data(mtcars)
db <- dbConnect(MonetDB.R::MonetDB(), embedded="./test.db")
# load mtcars into the database
dbWriteTable(conn=db, value = mtcars, name = "mtcars", overwrite=TRUE)
## Add a new column
dbSendQuery(db, "ALTER TABLE mtcars ADD v1 DOUBLE;")
## insert data into the new column
v1 <- mtcars["mpg"] * pi
dbSendQuery(db, "INSERT INTO mtcars (v1) VALUES (?)", bind.data=v1)
Run Code Online (Sandbox Code Playgroud)
并且错误消息:
Error in .local(conn, statement, ...) :
Unable to execute statement 'INSERT INTO mtcars (v1) VALUES ('c(65.9734457253857, 65.9734457253857, 71.6283125018473, 67.23008278...'.
Server says 'ERROR: 49.6371639267187, …Run Code Online (Sandbox Code Playgroud) 有没有办法在不安装R包的情况下将MonetDBLite用作C++应用程序中的存储引擎?或者有没有其他方法可以将MonetDB用作SQLite等嵌入式数据库?