【发布时间】:2018-07-21 04:10:00
【问题描述】:
考虑以下 SQL:
SELECT D.product_name
FROM business.payment P
LEFT JOIN dim.product_name D
ON D.product_id = P.product_id
查询返回支付表中的 product_names 列表,并基于连接。
如何在不拉入内存的情况下在 dplyr 中复制这样的内容?我正在处理数据库连接。
我尝试了以下方法,但无济于事:
product_name <-
business %>%
tbl('dim_product')
business %>%
tbl('payment') %>%
left_join(product_name, by = 'product_id') %>%
select(product_name) %>%
collect()
我搜索了很多,似乎没有人解决这个问题。
谢谢!
【问题讨论】:
-
R 将所有对象存储在内存中。因此,如果您使用
dplyr,那么您将在对象上使用它,因此在内存中使用它。话虽如此,您可以在dplyr中使用任意 SQL,例如tbl(my_db_extract_now_in_memory, sql("SELECT * FROM flights"))但它总是会在记忆中。 -
我正在尝试使用 dplyr 严格执行此操作。在
collect()触发之前,懒惰不应该将它们带入记忆中。 -
在
dplyr中做这一切没问题,但我只是说一旦提取它就会在内存中。请注意,这与通过 R 通过任何其他方式(例如RODBC)查询数据库没有什么不同。它不在内存中的一种方法是,如果您使用RPostgres或RODBC等发送 SQL 查询并仅使用它在在数据库中创建一个新表并且永远不会将数据导出到 R。 -
没关系。关键是要在最终拉取之前防止这种情况发生,因为有大量数据。