R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?
Posted
技术标签:
【中文标题】R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?【英文标题】:R: How to select a table from a schema in redshift using dplyr (function scr_postgres)? 【发布时间】:2015-09-08 12:34:14 【问题描述】:我使用 dplyr(函数 scr_postgres)在 redshift 中与我的数据库建立了连接,但因为它在一个架构下,我无法选择表。
尝试在不使用架构的情况下访问时出错:
requests <- tbl(my_db, "sessions")
Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: relation "sessions" does not exist
尝试使用一个字符串中的架构访问时出错:
requests <- tbl(my_db, "analytics.sessions")
Erro: Table analytics.sessions not found in database
尝试使用模式组合字符串访问时出错:
requests <- tbl(my_db, c("analytics", "sessions"))
Erro: length(from) not equal to 1
但在 RPostgreSQL 中它可以工作:
dbExistsTable(my_db$con, c("analytics", "sessions"))
[1] TRUE
【问题讨论】:
你能显示你的表模式吗?为什么查询analytics.sessions
时会报错Table snowplow_pivots.sessions not found in database
?根据我在手册 (cran.r-project.org/web/packages/DBI/DBI.pdf) 中阅读的内容,您不能将具有 2 个值的数组传递给 dbExistsTable
。函数tbl
从何而来?
@VerenaHaunschmid 感谢您强调这个问题。为了简洁起见,我更改了名称。 tbl 是 dplyr 包中的一个函数。
好的,我不知道您可以使用 dplyr 的函数直接查询数据库。但正如我所说,最后一个命令似乎不对,因为它只需要一个字符值而不是数组。你能展示你的数据库结构吗?
你能在 dplyr 中设置 search_path 吗?这将在会话级别设置它,但根据您的设置,您可以在集群级别默认它以包含分析架构。
@mike_pdb 就是这样!谢谢你。我可以设置它并且它工作:my_db <- src_postgres(host="host", port="5439", dbname = "dbname", user = "user", password = "XXXX", options="-c search_path=analytics")
【参考方案1】:
按照@mike_db here 的建议,我可以在 search_path 中设置架构。
为此,我需要在打开与 src_postgres 的连接时设置 [options] 参数:
my_db <- src_postgres(host="host", port="5439",
dbname = "dbname", user = "user", password = "XXXX",
options="-c search_path=analytics")
或者,您可以在选择表格时使用类似的东西:
requests <- tbl(my_db, sql("SELECT * from analytics.sessions WHERE 0=1"))
【讨论】:
感谢@mike_db 和雷纳托。对我来说,关键的见解是您可以将 select 语句包装在 sql() 中,作为指定模式的一种方式。这对用户更友好。以上是关于R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用 dplyr 在 group_by 之后应用自定义函数
R语言dplyr包使用dplyr函数使用group_by函数summarise函数和mutate函数计算分组占比实战
R语言使用dplyr包的select函数和filter函数进行行数据筛选(row selection)