2014-10-03 27 views
0

如何從dplyr中的任何(常規)SQL查詢中接收完整結果?這是一個玩具示例,其中SQL查詢只是返回完整的表格。more dplyr中的500結果行泛型SQL

library("plyr") 
library("dplyr") 

## connect to a database 
hflights_sqlite <- tbl(hflights_sqlite(), "hflights") 
my_con <- src_sqlite(hflights_sqlite$src$path) 

## here is the problem 
tbl(my_con, sql("SELECT * FROM hflights")) 
## ... 
## Warning message: 
## Only first 500 results retrieved. Use n = -1 to retrieve all. 
tbl(my_con, sql("SELECT * FROM hflights"), n=-1) 
## ... 
## Warning message: 
## Only first 500 results retrieved. Use n = -1 to retrieve all. 

(這是不是一個關於這裏使用,當然,具體的簡單的SQL問題)

+0

我對'src_sqlite'不熟悉。但是,前兩行不適合我。我嘗試了以下'my_db < - src_sqlite(path = tempfile(),create = TRUE); my_db < - copy_to(my_db,iris)'我擁有整個虹膜數據。 – jazzurro 2014-10-03 17:17:50

+0

請參閱'?collect'。 – hadley 2014-10-03 21:01:39

+0

@hadley謝謝。但你能在這裏更明確嗎?即使在閱讀'collect'之後,我也不清楚如何使用'collect'來進行一般的SQL查詢。顯然'收集(tbl(my_con,sql(「選擇*從hflights」)))'是沒有解決方案。 – Andreas 2014-10-03 21:08:54

回答

0

使用collect(n=Inf)強制dplyr獲取所有數據。

下面是一個例子:

results <- CONNECTION %>% tbl(sql(SQL_QUERY)) %>% collect(n=Inf)

其中

你的情況CONNECTIONsrc_sqlite(hflights_sqlite$src$path)

SQL_QUERY你的情況是"SELECT * FROM hflights"

看起來在設置限制多少緩存的限制方面看起來有些缺陷,但它已被修復:https://github.com/hadley/dplyr/issues/407

-2

@Andreas:如果我理解dplyr,它總是偷懶,只要可能的。當您執行上面的tbl調用或任何tbl調用時,它會提取足夠的數據以顯示它的工作情況...如果您需要整個結果集,則需要收集結果,per @ hadley的評論或其他強行全面的評估,例如,

head(tbl(my_con, sql("SELECT * FROM hflights")), n=999999) 

... n=-1應該工作,但我還沒有看到它在我的測試正常工作。

+0

感謝您關注此事。非常感謝。我會認爲這是一個解決方法,因爲使用頭來收集結果並不感覺「正確」。但是它對我也不起作用:'head(tbl(my_con,sql(「SELECT * FROM hflights」)),n = 999999) 錯誤:限制不是整數向量 另外:警告消息: 只有第一個檢索到500個結果。使用n = -1來檢索所有數據。' – Andreas 2014-10-04 20:21:12

+0

對不起...這是dplyr當前發行版中的一個錯誤,我認爲...嘗試 head(tbl(my_con,sql(「SELECT * FROM hflights」)) ,N = as.integer(999999)) 參見:https://github.com/hadley/dplyr/issues/407 – 2014-10-05 03:50:48

+0

另外,還要注意收集真的是做到這一點的預期方式... TBL( my_con,sql(「SELECT * FROM hflights」))%>%collect – 2014-10-05 03:54:41