r - dbplyr 目前是否假定 redshift 连接实际上是 postgres 连接?

标签 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() 函数。在这种情况下,我会期望将数据拉入我的本地 session 的行为,并将其作为 R 中的一个因素进行处理,但是它似乎没有注册 a) Redshift 没有那个功能,b) Redshift 没有'不支持该数据类型(我相信,尽管愿意进行更正),c) 意图是提取数据并创建因子。

这似乎得到了文件 here 的支持。 ,这将 Redshift 带入了 postgres 环境,尽管 Redshift 在范围上远比 postgres 有限。

我的具体问题是:

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

最佳答案

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

关于r - dbplyr 目前是否假定 redshift 连接实际上是 postgres 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45079212/

相关文章:

r - 在 tidyverse 中,类 "tbl"和 "tbl_df"的对象有什么区别?

r - 使用 dbplyr 跨数据库连接

r - 合并列,同时忽略重复项和 NA

amazon-web-services - 跳过 AWS Redshift 外部表中的标题行

r - R 中表格的条件格式......更好的方法?

r - 如何列绑定(bind)两个ffdf

使用命名列表重命名列表列表

r - 如果耗时过长,如何使用 withTimeout 函数中断表达式

mysql - 使用 SQL 选择动态 Unix 纪元时间

amazon-redshift - 将动态帧写入 Redshift 时,AWS Glue 中出现 "File ready exists"错误