将SQL查询中的表直接写入R中的其他数据库

Posted

技术标签:

【中文标题】将SQL查询中的表直接写入R中的其他数据库【英文标题】:Writing table from SQL query directly to other database in R 【发布时间】:2019-08-23 06:49:56 【问题描述】:

所以在数据库 Y 我有一个表 X 有超过 4 亿个观察值。然后我有一个带有 ID 的 KEY.csv 文件,我想用它来过滤数据(小型数据集,大约 50k 个唯一 ID)。如果我有无限的内存,我会这样做:

require(RODBC)
require(dplyr)

db <- odbcConnect('Y',uid = "123",pwd  = '123')
df  <- sqlQuery(db,'SELECT * from X')
close(db) 
keys <- read.csv('KEY.csv')
df_final <- df %>% filter(ID %in% KEY$ID)

我的问题是,我无权将 KEY.csv 文件上传到数据库 Y 并在那里进行过滤。是否有可能在查询中进行过滤,同时引用加载到 R 内存中的文件?然后将这个过滤后的 X 表直接写入我有权访问的数据库?我认为即使在过滤它之后,R 也可能无法将它保存在内存中。

我也可以尝试在 Python 中执行此操作,但是在该语言方面没有太多经验。

【问题讨论】:

【参考方案1】:

我不知道你有多少键,但也许你可以尝试使用build_sql() 函数来使用查询中的键。 我不使用 RODBC,我认为您应该使用 odbc 和 DBI (https://db.rstudio.com)。

library(dbplyr) # dbplyr not dplyr
library(DBI)
library(odbc)
# Get keys first
keys = read.csv('KEY.csv')
db = dbConnect('Y',uid = "123",pwd  = '123') # the name of function changes in odbc
# write your query (dbplyr)
sql_query = build_sql('SELECT * from X
                where X.key IN ', keys, con = db)
df = dbGetQuery(db,sql_query) # the name of function changes in odbc

【讨论】:

我使用了以下代码:db2 &lt;- DBI::dbConnect(odbc::odbc(),'Y',uid = "123",pwd = '123') df2 &lt;- tbl(db2, in_schema('A', 'X')) %&gt;% filter(ID %in% !!unique(KEY$ID)) 但是,我在 KEY.csv 中有大约 50 个唯一 ID,因此即使获取行数也非常慢。还有其他方法可以处理这个数据集吗? 也许尝试使用我的代码使用build_sql() 函数在 SQL 查询中进行过滤? 我的代码完全相同,但是在我的评论中(我现在无法编辑),我认为有 50 个唯一 ID,而不是 50k(50 000)。表 X 有 4.73 亿行和 16 列,它保存在 Postgresql 数据库中,如果对任何人有帮助的话。 你应该在 sql 查询中使用 LEFT JOIN。 但我不想加入任何其他数据,只需过滤掉不在 KEY.csv 中的观察结果

以上是关于将SQL查询中的表直接写入R中的其他数据库的主要内容,如果未能解决你的问题,请参考以下文章

怎样删除视图中的全部数据 用SQL语言编写。

熊猫将数据框写入其他 postgresql 模式

第八篇|Spark SQL百万级数据批量读写入MySQL

SQL中的表扫描和索引扫描

sql多表查询出来的数据在C#中用啥装载比较好,是泛型集合还是集合??还有其他的可以装吗??

如何在 R 中使用 SQLsave 进行查询?