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