dbplyr 当前是不是假设 redshift 连接实际上是 postgres 连接?
Posted
技术标签:
【中文标题】dbplyr 当前是不是假设 redshift 连接实际上是 postgres 连接?【英文标题】:Does dbplyr currently assume a redshift connection is actually a postgres connection?dbplyr 当前是否假设 redshift 连接实际上是 postgres 连接? 【发布时间】:2017-07-13 11:24:28 【问题描述】:愉快地在 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 没有t 支持该数据类型(我相信,尽管愿意更正),c) 意图是提取数据并创建因子。
here 文件似乎支持这一点,它将 Redshift 引入了 postgres 环境,尽管 Redshift 在范围上比 postgres 受限得多。
我的具体问题是:
我的推理过程对错误是否正确? 解决方法是什么,是在此阶段之前收集我的结果,然后在本地工作,还是我错过了什么?【问题讨论】:
我也想用dbplyr
标记它,但我还不能制作原始标记。如果您有权限,请随意编辑。
factor
不是sql
中的数据类型,您希望得到什么?
也许你在关注myTable %>% collect %>% mutate_all(as_factor)
?
【参考方案1】:
挑战是将 R 变量类型映射到适当的数据库类型。今天,dbplyr
翻译为as.numeric()
、as.double()
、as.integer()
和as.character()
。 dbplyr
无法识别的任何函数都会逐字传递到数据库,这就是结果为 as_factor()
的原因。我可能错了,但 Redshift 没有分解变量,所以也许使用 as.character()
是一个更好的选择。我在使用数据库时使用强制转换为分类数据的那个。我鼓励您使用当前的一种翻译,并避免使用collect()
,尤其是在非常大的数据集上。
【讨论】:
以上是关于dbplyr 当前是不是假设 redshift 连接实际上是 postgres 连接?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 连接到 Redshift 数据 - 错误:当前事务被中止,命令被忽略,直到事务块结束
Azure C# 应用服务 ODBC 连接到 Redshift