2017-07-03 3 views
1

Ich bin versucht, eine Spalte in einer Spark-Datenrahmen zu aggregieren Scala mit, etwa so:Wie verwende ich countDistinct in Spark/Scala?

import org.apache.spark.sql._ 

dfNew.agg(countDistinct("filtered")) 

aber ich den Fehler:

error: value agg is not a member of Unit 

Kann mir jemand erklären, warum?

EDIT: um zu klären, was ich versuche zu tun: Ich habe eine Spalte, die ein String-Array ist, und ich möchte die verschiedenen Elemente über alle Zeilen zählen, nicht interessiert an anderen Spalten. Daten:

+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|racist|filtered                                      | 
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|false |[rt, @dope_promo:, crew, beat, high, scores, fugly, frog, , https://time.com/sxp3onz1w8]                  | 
|false |[rt, @axolrose:, yall, call, kermit, frog, lizard?, , https://time.com/wdaeaer1ay]                    | 

Und ich möchte, gefiltert zu zählen, geben:

rt:2, @dope_promo:1, crew:1, ...frog:2 etc 
+0

für die Aggregatfunktion müssen Sie groupBy zuerst anwenden. Dies kann Ihnen helfen https://stackoverflow.com/questions/33500816/how-to-use-countdistinct-in-scala-with-spark –

+4

Mögliche Duplikat von [Wie countDistinct in Scala mit Spark zu verwenden?] (https://stackoverflow.com/questions/33500816/how-to-use-countdistinct-in-scala-with-spark) –

+0

OK vielleicht versuche ich, die falsche Funktion zu verwenden. Ich habe eine Spalte mit ist ein String-Array, und ich möchte die verschiedenen Elemente über alle Zeilen zählen, nicht interessiert an anderen Spalten. Ich werde meine Frage bearbeiten, um dies zu reflektieren. – schoon

Antwort

1

Sie benötigen Array explode zuerst, bevor Sie Vorkommen zählen: die Zählungen der einzelnen Elemente anzuzeigen:

dfNew 
.withColumn("filtered",explode($"filtered")) 
.groupBy($"filtered") 
.count 
.orderBy($"count".desc) 
.show 

oder nur um die Anzahl der verschiedenen Elemente zu erhalten:

val count = dfNew 
.withColumn("filtered",explode($"filtered")) 
.select($"filtered") 
.distinct 
.count