使用 tbl 和 src_monetdblite 访问数据

Posted

技术标签:

【中文标题】使用 tbl 和 src_monetdblite 访问数据【英文标题】:Using tbl and src_monetdblite to access data 【发布时间】:2018-10-10 16:09:10 【问题描述】:

对不起,如果这个问题已经在别处问过,我找不到。我正在处理 MonetDBLite 中的一些 basic examples。

> dbGetQuery(dbcon, "SELECT MAX(mpg) FROM mtcars WHERE cyl = 8")
L3
1 19.2

有效,但是

> ms <- MonetDBLite::src_monetdblite("./DB")
> t <- tbl(ms, "mtcars")
Error in UseMethod("tbl") : 
no applicable method for 'tbl' applied to an object of class
"c('src_monetdb', 'src_sql', 'src')"

似乎它试图将 db 分配给 t 而不是 table。

任何建议将不胜感激。

我一直在仔细阅读资源并找到了一个 userR2016 演示文稿,并注意到这里的不同之处:

> ms
src:  MonetDBEmbeddedConnection
tbls: mtcars

好奇...

【问题讨论】:

【参考方案1】:

我非常喜欢将MonetDBLitedplyr 一起使用。我对 Hannes Mühleisen(感谢您的包裹!)的补充是,您加载包裹的顺序似乎很重要。在dplyrdbplyr 之后加载MonetDBLite 似乎是我的关键。首先加载 MonetDBLite 会导致类似于 nzgwynn 指出的错误。

有时我可以毫无问题地连接到数据库。其他时候我会收到如下错误消息:

UseMethod("db_query_fields") 中的错误:没有适用于 'db_query_fields' 的方法应用于“MonetDBEmbeddedConnection”类的对象

像 nzgwynn 一样,我很困惑为什么它有时会起作用,但有时却不起作用。重新启动和重新安装不一定能解决我的问题。

这条线索,来自一个关于sparklyr的问题,引导我探索包加载顺序:

https://github.com/rstudio/sparklyr/issues/38

就像sparklyr 中提到的那样,我注意到其他 R 数据库包,如果全局环境已经包含连接对象,MonetDBLite 将自动加载和附加。我的问题是我的工作区中有一个src_monetdb 对象,这导致MonetDBLite 在启动RStudio 时加载。因此,虽然我以为我是在 dplyrdbplyr 之后加载它,但实际上是先加载。如果我清除工作区然后重新启动,我可以按首选顺序加载包。到目前为止,这种方法已经奏效。

我已经看到从一个干净的工作区开始通常被建议为良好的做法,例如:https://twitter.com/hadleywickham/status/561146907519500288。考虑到MonetDBLite 的快速查询能力,从一个全新的工作区开始,您将不会浪费任何时间。

最后,我非常愿意使用 MonetDBLite。我在RStudio's database page 上看到了它,并立即对它的设置简单性和速度印象深刻。这是我发现在 R 中处理约 2 GB 数据集的最佳方式。以交互方式探索数据时,dplyr 查询运行得非常快,感觉就像我正在处理内存中的数据。如果我只想将整个数据集加载到内存中,MonetDBLite 与我尝试过的其他方法一样快或更快,例如 fst 包中的 read.fst()

【讨论】:

感谢您的详尽回答!你知道为什么加载包的顺序很重要吗?这对环境有什么影响?另外,如果我在内存中有数据(D),那么使用 D 嗨@nzgwynn,我很高兴你发布了这个问题,因为我认为我不会让它工作。为什么顺序很重要,我不知道……我只是感激所有这些伟大的免费技术的用户。在阅读类似问题时,我的猜测是软件包之间存在一些冲突。在包对函数或对象使用相同名称的情况下,稍后加载的包会“屏蔽”在它之前加载的对象。这就是我的工作理论——最后加载MonetDBLite 将使其优先于其他包。然而,这个理论可能是错误的...... 我和某人交谈过,他说 dplyer 和 dbplayer 改变了指针,这会使 R(和其他包)很难找到东西。【参考方案2】:

我关闭 R 并再次打开它,相同的编码工作正常......

【讨论】:

【参考方案3】:

您需要在使用tbl 和朋友之前致电library("dplyr")。还要确保你安装了dbplyr

更新:另外,请确保在启动时加载的存储工作区中没有连接对象 (src)。从 .Rdata 文件加载连接不起作用!而是在每次运行脚本时从头开始创建连接/src。

【讨论】:

他们是! '> library("dbplyr") > library("dplyr") > mt 它在我的 Ubuntu 虚拟机上完美运行,但在我的 Windows10 本地却不行。为什么会这样? 天啊!!我关闭了 R 并再次启动它,它起作用了!!怎么回事??我不明白为什么它以前不起作用......

以上是关于使用 tbl 和 src_monetdblite 访问数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R DBI 和 bigrquery 将虚拟 BQ 表写回 BQ?

rbind tbl 和 df 给出过滤器错误

在触发器中加入更新命令

R语言dplyr包as.tbl函数(转化为tibble类型)和is.tbl函数(检查数据是否为tibble类型)实战

按名称对项目列表

sqlite_master 中的 name 和 tbl_name 有啥区别?