dbplyr当前是否假设红移连接实际上是postgres连接?

时间:2017-07-13 11:24:28

标签: r dplyr amazon-redshift dbplyr

我很乐意在redshift上使用dbplyr做基本的事情,我发现很难执行更复杂的分析,我想知道这是否是由于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)意图是将数据输入并创建因子。

这似乎得到了文件here的支持,这使得Redshift陷入了postgres环境,尽管Redshift的范围远远超过postgres。

我的具体问题是:

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

1 个答案:

答案 0 :(得分:2)

面临的挑战是将R变量类型映射到适当的数据库类型。今天,dbplyr翻译了as.numeric()as.double()as.integer()as.character()dbplyr无法识别的任何函数都会逐字传递到数据库,这就是为什么结果为as_factor()的原因。我可能错了,但是Redshift没有因式分解变量,因此也许使用as.character()是更好的选择。我在处理数据库时使用强制转换为分类数据的方法。建议您使用当前的翻译版本之一,并避免使用collect(),尤其是在非常大的数据集上。