【问题标题】:How to join tables from different SQL databases using R and dplyr?如何使用 R 和 dplyr 连接来自不同 SQL 数据库的表?
【发布时间】:2017-06-22 15:26:29
【问题描述】:

我正在使用dplyr (0.7.0)dbplyr (1.0.0)DBI 0.6-1odbc (1.0.1.9000)。我想做类似以下的事情:

db1 <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "SQL Server",
  Server = "MyServer",
  Database = "DB1"
)
db2 <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "SQL Server",
  Server = "MyServer",
  Database = "DB2"
)
x <- tbl(db1, "Table1") %>%
  dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn") 

但我不断收到一个似乎没有任何实质内容的错误。当我使用show_query 时,似乎代码正在尝试创建一个连接两个表的 SQL 查询,而不考虑单独的数据库。根据dplyr::left_join 的文档,我也尝试过:

x <- tbl(db1, "Table1") %>%
      dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn", copy = TRUE) 

但输出或错误消息没有变化。是否有不同的方法可以在同一台服务器上连接来自不同数据库的表?

【问题讨论】:

  • 您可以使用dbplyr::collect() 从每个数据库中强制/拉取数据,然后在本地 R 实例中进行连接。这建议您应该在调用 collect() 之前进行过滤和基本选择,以免过度拉取数据。
  • 我的备份计划是拉入两组数据,然后在 R 中进行本地连接。问题是有时数据集非常大,我想使用来自的列过滤结果在本地拉入数据之前,一个单独的数据库。
  • 坦率地说,像这样的多 DBMS 连接/过滤在任何语言中都很难(除了带有外键的原生 SQL 等)。如果您提供来自每个表的代表性样本数据(即,最小但足够的可变性来表示),我们可能会提供帮助,但我认为您将无法从至少一个 DBMS 中提取大量数据。

标签: sql-server r dplyr dbplyr


【解决方案1】:

我从您提供的代码中假设 (a) 您有兴趣通过 dplyr 的语法加入两个 tbl 对象之前您运行 collect() 并拉将结果存入本地内存,并且 (b) 您希望在调用 tbl() 时直接引用数据库对象。

如果您想利用 dplyr 以编程方式构建查询逻辑,同时利用数据库服务器将大量数据 INNER JOIN 到您感兴趣的集合,这些选择很重要。(或者至少是这样为什么我会在这里结束。)

我找到的解决方案使用一个连接而不指定数据库,并使用in_schema() 拼出数据库和架构信息(我在任何地方都找不到此文档或暗角):

conn <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "SQL Server",
  Server = "MyServer"
)

x <- tbl(src_dbi(conn),
         in_schema("DB1.dbo", "Table1")) %>%
  dplyr::left_join(tbl(src_dbi(conn),
                       in_schema("DB1.dbo", "Table2")),
                   by = "JoinColumn")

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但我无法使用 dplyr::left_join 解决它。

    至少我能够使用以下解决方法完成这项工作。 我在没有声明默认数据库的情况下连接到 SQL Server,然后使用 sql() 运行查询。

    con <- dbConnect(odbc::odbc(), dsn="DWH" ,  uid="", pwd= "" )
    
    data_db <- tbl( con, sql("SELECT * 
                        FROM DB1..Table1 AS a
                        LEFT JOIN DB2..Table2 AS b ON a.JoinColumn = b.JoinColumn") ) 
    

    data_db %>% ...

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我会使用merge() 函数对表执行左连接。类似于x &lt;- merge(df1, df2, by = "JoinColumn", all.x = TRUE)

      【讨论】:

      • 我不相信 merge() 能够以与 dplyr 类似 left_join() 的方式相同的方式使用 dbplyr 和数据库连接。
      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2015-07-31
      • 2019-11-05
      • 1970-01-01
      • 2019-03-09
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多