将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 <- DBI::dbConnect(odbc::odbc(),'Y',uid = "123",pwd = '123')
df2 <- tbl(db2, in_schema('A', 'X')) %>% 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中的其他数据库的主要内容,如果未能解决你的问题,请参考以下文章