使用dplyr访问sql表/查询时计算行数

时间:2016-05-20 16:16:08

标签: mysql r postgresql sqlite dplyr

计算使用dplyr访问sql表的行数的有效方法是什么。 MWE低于使用SQLite,但我使用PostgreSQL并遇到同样的问题。基本上昏暗()不是很一致。我用了

dim()

这适用于数据库中的模式(第一种情况),但是当我从同一模式的SQL查询创建tbl时(第二种情况),它不是很一致。我的行数是数百万,或者即使只有1000行也能看到。我得到NA或??有什么遗失的吗?

#MWE
test_db <- src_sqlite("test_db.sqlite3", create = T)
library(nycflights13)
flights_sqlite <- copy_to(test_db, flights, temporary = FALSE, indexes = list(
c("year", "month", "day"), "carrier", "tailnum"))

flights_postgres <- tbl(test_db, "flights")

第一种情况(来自直接模式的表)

flights_postgres

 > flights_postgres
 Source: postgres 9.3.5 []
 From: flights [336,776 x 16]

   year month day dep_time dep_delay arr_time arr_delay carrier tailnum flight    origin dest air_time distance hour minute
  1  2013     1   1      517         2      830        11      UA  N14228   1545    EWR  IAH      227     1400    5     17
  2  2013     1   1      533         4      850        20      UA  N24211   1714    LGA  IAH      227     1416    5     33

#using dim()
> dim(flights_postgres)
[1] 336776     16

以上工作并获得行数的计数。 第二种情况(SQL查询表)

 ## use the flights schema above but can also be used to create other variables (like lag, lead)   in run time
 flight_postgres_2 <- tbl(test_db, sql("SELECT * FROM flights"))

  >flight_postgres_2
 Source: postgres 9.3.5 []
 From: <derived table> [?? x 16]

  year month day dep_time dep_delay arr_time arr_delay carrier tailnum flight     origin dest air_time distance hour minute
   1  2013     1   1      517         2      830        11      UA  N14228   1545    EWR  IAH      227     1400    5     17
   2  2013     1   1      533         4      850        20      UA  N24211   1714    LGA  IAH      227     1416    5     33

> 
> dim(flight_postgres_2)
[1] NA 16

如你所见它打印为??或者NA。所以不是很有帮助。

我通过使用collect()或者使用as.data.frame()将输出转换为数据框来检查维度。但考虑到大量行可能需要的时间,这两种方法可能不是理想的解决方案。

1 个答案:

答案 0 :(得分:2)

我认为答案是@alistaire建议的:在数据库中做。

> flight_postgres_2 %>% summarize(n())
Source: sqlite 3.8.6 [test_db.sqlite3]
From: <derived table> [?? x 1]

      n()
    (int)
1  336776
..    ...

要求dim执行此操作将是您的蛋糕(使用dplyr对SQL进行惰性评估,将数据保留在数据库中)并将其吃掉(完全访问{{1}中的数据}})。

请注意,这是在@ alistaire的方法下面进行的:

R