2016-10-05 53 views
0

請看下面的SQL:dplyr 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() 

我已經搜查相當大的,沒有一個似乎已經解決了這個。

謝謝!

+1

R將所有對象存儲在內存中。所以,如果你使用的是'dplyr',你就在對象上,因此在內存中使用它。話雖如此,你可以在'dplyr'中使用任意的SQL,例如'tbl(my_db_extract_now_in_memory,sql(「SELECT * FROM flights」))'但它總是在內存中。 –

+0

我試圖嚴格使用dplyr來做到這一點。在collect()觸發之前,懶惰不應該將它們帶入內存。 –

+0

在'dplyr'中這樣做是沒有問題的,但我只是說它一旦被提取就會在內存中。請注意,這是沒有什麼不同的,然後通過任何其他方式通過R查詢數據庫,例如'RODBC'。它不會在內存中的一種方式是,如果你使用'RPostgres'或'RODBC'等發送一個SQL查詢,並用它在數據庫*中創建一個新表*並且從不將數據導出到R –

回答

1

您可以使用任意的SQL在dplyr

tbl(my_data, sql("SELECT * FROM flights")) 

注意,沒有比通過任何其他方式查詢到R的數據塊,如RODBC不同。

當然,提取的數據將通過總是一旦通過查詢導入到R中,它就會在內存中。它不會在內存中的一種方式是,如果您使用RPostgresRODBC等發送SQL查詢並僅用它在數據庫內創建新表,並且從未將數據導出到R.

+0

是的,但我試圖用dplyr來做到這一點,所以我只能使用一種語言。 '這樣的事情會被複制到dplyr而不會被拉回到內存中嗎?' –

+0

@PhillipBlack你在說什麼?在我的答案**中的代碼是**'dplyr',我回答了你的問題,而不是將它拉進內存。就像我所說的,你可以在'dplyr'內使用任意的SQL,就像我的例子。參見'?tbl'並閱讀精細手冊https://cran.r-project.org/web/packages/dplyr/dplyr.pdf和https://cran.r-project.org/web/packages/dplyr/插圖/數據庫。html –

+0

@PhillipBlack所以,回顧一下,正如你所提到的,'dplyr'可以通過懶惰等到最後一秒,也就是說它只是將最終提取(不是中間表)提取到內存中,這正是我的代碼中發生的事情回答。對於絕對沒有東西被拉入內存然後(顯然)唯一的解決方案是使用'RODBC'或任何類似的包來查詢你的數據到你的數據庫中一個新創建的表,從而完全繞過R。 –

0

這是一段時間後,但也許你仍然在尋找或好奇的基於dplyr動詞的選項。我正在爲我的工作研究同樣的問題,並且遇到了你的(某種)未解答的問題。當我使用DBIodbc包對MSSQL數據庫運行時,下面的代碼適用於我。

我在加入之前從表格中選擇感興趣的列,因爲這在查詢數據庫時通常是最佳做法。 dplyr連接函數將默認進行自然連接,因此您可能不必明確提供by參數。

db_con <- DBI::dbConnect(
    drv = odbc::odbc(), 
    dsn = <data source name> 
) 

db_con %>% 
    tbl("table1") %>% 
    select(col1, col2, col3) 
    left_join(
    db_con %>% tbl("table2") %>% select(col3, col4, col5) 
)