0

Ich möchte die am häufigsten vorkommende Zeichenfolge in einer Zeile in einem bestimmten Fenster abrufen und diesen Wert in einer neuen Zeile haben. (benutze Pyspark)Spark-Fensterfunktion aggregiert durch häufigsten Wert in Zeile

So sieht meine Tabelle aus.

window label value 
123   a  54 
123   a  45 
123   a  21 
123   b  99 
123   b  78 

Ich mache einige Aggregation und zur Zeit sowohl ich Gruppierung von window und label.

sqlContext.sql(SELECT avg(value) as avgValue FROM table GROUP BY window, label) 

Dies gibt den Mittelwert in dem Fenster = 123 und label = a und die durchschnittliche wo Fenster = 123 und label = b

Was ich versuche, zu tun ist, um label durch am häufigsten Zeichenfolge absteigend vorkommenden , also dann in meiner SQL-Anweisung kann ich tun SELECT first(label) as majLabel, avg(value) as avgValue FROM table GROUP BY window

Ich versuche, dies in einer Fensterfunktion zu tun, aber bin gerade nicht ganz dahin.

group = ["window"] 

w = (Window().partitionBy(*group)) 
+0

@ zero323 dies scheint Wie etwas, womit du umgehen könntest? Angesichts Ihrer Expertise mit Sparks Fensterfunktionen: D – other15

Antwort

0
df = spark.createDataFrame([['123','a','54'],['123','a','45'],['123','a','21'],['123','b','99'],['123','b','78'],],['window','label','value']) 

ein Recht WindowSpec definieren.

win_spec = window.partitionBy(['window','label']).orderBy(col('value').desc()) 

Gibt eine fortlaufende Nummer in 1 innerhalb eines Fensters Partition [ 'Fenster', 'Label'].

str_rank = df.withColumn('string_rank',row_number().over(win_spec)) 
str_rank.show() 

Dies ist, wie die df sieht jetzt:

Wählen Sie das Fenster mit "string_rank" == 1.

str_rank.where(col('string_rank')==1).drop('string_rank').show()