R语言 dbplyr目前是否假设红移连接实际上是postgres连接?



在Redshift上愉快地玩dplyr来做基本的事情之后,我发现很难执行更复杂的分析,我想知道这是由于dbplyr的当前工具集,还是我的错误。

一个典型的 mwe:

library(dplyr)
library(dbplyr)
library(forcats)
redshift <- dbConnect(driver, url) #  <<<obviously put in specific details here
tbl(redshift, "table") -> mytable
myTable %>% colnames() # This returns the correct colnames, great, working connection!
myTable %>% mutate_all(as_factor) # This gives an error

在这种情况下,错误是dbplyr已将sql发送到数据库,如下所示:

SELECT AS_FACTOR("col_1") AS "col_1", AS_FACTOR("col_2") AS "col_2"

因此返回的错误是:

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
Unable to retrieve JDBC result set for SELECT AS_FACTOR("col_1") AS "col_1", AS_FACTOR("col_2") AS "col_2"....

但是,据我所知,Redshift没有AS_FACTOR()功能。在这种情况下,我本来希望该行为将数据拉入我的本地会话,并将其作为 R 中的一个因子进行处理,但是它似乎没有注册 a) Redshift 没有该功能,b) Redshift 不支持该数据类型(我相信,尽管愿意被纠正),c) 目的是将数据拉入并创建因子。

这似乎得到了这里的文件的支持,该文件将 Redshift 提升到postgres环境中,尽管Redshift的范围比postgres要有限得多。

我的具体问题是:

  • 我的扣除过程是否正确?
  • 解决此问题的方法是什么,是在此阶段之前收集我的结果,然后在本地工作,还是我错过了什么?

挑战在于将R变量类型映射到正确的数据库类型。今天,dbplyr翻译as.numeric()as.double()as.integer()as.character()dbplyr无法识别的任何函数都会逐字传递到数据库,这就是结果as_factor()的原因。 我可能是错的,但 Redshift 没有因式分解变量,所以也许使用as.character()是一个更好的选择。 我在使用数据库时使用强制进入分类数据。 我鼓励您使用当前的翻译之一,并避免使用collect(),特别是在非常大的数据集上。

最新更新