2016-05-20 3 views
1

zählen Was wäre der effiziente Weg, um die Anzahl der Zeilen zu zählen, die mit dplyr auf SQL-Tabelle zuzugreifen. MWE benutzt SQLite, aber ich benutze PostgreSQL und habe das gleiche Problem. Grundsätzlich ist dim() nicht sehr konsistent. Ich benutzenAnzahl der Zeilen bei Verwendung von dplyr für den Zugriff auf SQL-Tabelle/Abfrage

dim() 

Dies funktioniert für ein Schema in der Datenbank (erster Fall), ist aber nicht sehr konsequent, wenn ich eine Tabl aus einer SQL-Abfrage für das gleiche Schema (zweiter Fall) erstellen. Meine Anzahl an Zeilen ist in Millionen oder ich sehe das sogar mit einer kleinen 1000 von Zeilen. Ich bekomme NA oder ??. Gibt es etwas, das fehlt?

#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") 

Erster Fall (Tabelle aus direkten Schema)

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 

Die oben genannten Arbeiten und die Zählung der Anzahl der Zeilen erhalten. Zweiter Fall (Tabelle aus SQL-Abfrage)

## 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 

Wie Sie es entweder druckt wie sehen ?? oder NA. Also nicht sehr hilfreich.

Ich habe dies umgehen, indem Sie entweder mit collect() oder dann konvertieren Sie die Ausgabe in einen Datenrahmen mit as.data.frame(), um die Dimension zu überprüfen. Aber diese zwei Methoden sind möglicherweise nicht die ideale Lösung angesichts der Zeit, die für eine größere Anzahl von Reihen benötigt wird.

+0

Ich kann nicht Ihre MWE zu arbeiten, es zu testen, aber ich würde versuchen, 'tally' oder' n' wenn Sie innerhalb einer anderen Funktion. – alistaire

+0

@alistaire machte Änderungen an der MWE - verwendet diesmal SQLite, aber das Problem ist das gleiche. – rajvijay

+0

'tally' funktioniert gut für mich, wie' summieren (n()) ' – alistaire

Antwort

1

Ich denke die Antwort ist, was @alistaire vorschlägt: Tun Sie es in der Datenbank.

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

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

dim Fragen dazu Ihren Kuchen (mit dplyr, in dem Datum in der Datenbank lazy evaluation von SQL) und isst es auch sein, die tun würde (mit vollem Zugriff auf die Daten in R).

Beachten Sie, dass diese @ Ansatz alistaire der unter tut:

> flight_postgres_2 %>% summarize(n()) %>% explain() 
<SQL> 
SELECT "n()" 
FROM (SELECT COUNT() AS "n()" 
FROM (SELECT * FROM flights) AS "zzz11") AS "zzz13" 


<PLAN> 
    selectid order from               detail 
1  0  0 0 SCAN TABLE flights USING COVERING INDEX flights_year_month_day 
Verwandte Themen