2015-12-22 20 views
12

Quando uso dataframe groupby come questo:Come ottenere altre colonne quando si utilizza Spark DataFrame groupby?

df.groupBy(df("age")).agg(Map("id"->"count")) 

mi limiterò a ottenere un dataframe con colonne "età" e "count (id)", ma in df, ci sono molte altre colonne come "nome".

In tutto, voglio ottenere il risultato come in MySQL,

"selezionare il nome, l'età, contano (id) da df gruppo per età"

Cosa devo fare quando usa groupby in Spark?

+0

perché non usare "seleziona nome, età, conteggio (id) dal gruppo df per età, nome" ?, solo "gruppo per età" selezionerà molti nomi diversi, ma visualizza solo un nome – taigetco

+0

Nella mia domanda, ho solo dare un esempio semplice. Quando usi "gruppo per età, nome", otterrà un risultato diverso con "gruppo per età" a quanto pare .... – Psychevic

risposta

11

In breve, in generale, è necessario unire risultati aggregati con la tabella originale. Spark SQL segue la stessa convenzione pre-SQL: 1999 come la maggior parte dei principali database (PostgreSQL, Oracle, MS SQL Server) che non consente colonne aggiuntive nelle query di aggregazione.

Poiché per le aggregazioni come il conteggio i risultati non sono ben definiti e il comportamento tende a variare nei sistemi che supportano questo tipo di query, è possibile includere colonne aggiuntive utilizzando aggregazione arbitraria come first o last.

In alcuni casi è possibile sostituire agg utilizzando select con funzioni finestra e successive where ma a seconda del contesto può essere piuttosto costoso.

+0

Va bene ... piangendo – Psychevic

-2

Si può fare in questo modo:

dati del campione:

name age id 
abc  24 1001 
cde  24 1002 
efg  22 1003 
ghi  21 1004 
ijk  20 1005 
klm  19 1006 
mno  18 1007 
pqr  18 1008 
rst  26 1009 
tuv  27 1010 
pqr  18 1012 
rst  28 1013 
tuv  29 1011 
df.select("name","age","id").groupBy("name","age").count().show(); 

uscita:

+----+---+-----+ 
    |name|age|count| 
    +----+---+-----+ 
    | efg| 22| 1| 
    | tuv| 29| 1| 
    | rst| 28| 1| 
    | klm| 19| 1| 
    | pqr| 18| 2| 
    | cde| 24| 1| 
    | tuv| 27| 1| 
    | ijk| 20| 1| 
    | abc| 24| 1| 
    | mno| 18| 1| 
    | ghi| 21| 1| 
    | rst| 26| 1| 
    +----+---+-----+ 
4

Un modo per ottenere tutte le colonne dopo aver fatto un groupBy è usare join functi sopra.

feature_group = ['name', 'age'] 
data_counts = df.groupBy(feature_group).count().alias("counts") 
data_joined = df.join(data_counts, feature_group) 

data_joined ora avrà tutte le colonne compresi i valori di conteggio.

Problemi correlati