2017-10-23 3 views
-1

Ich habe den folgenden Code gefunden, um n Zeilen aus dem Datenframe nach unique_id gruppiert auszuwählen.Scala-Code in PySpark konvertieren

import org.apache.spark.sql.expressions.Window 
import org.apache.spark.sql.functions.row_number 

val window = Window.partitionBy("userId").orderBy($"rating".desc) 

dataframe.withColumn("r", row_number.over(window)).where($"r" <= n) 

Ich habe versucht, die folgenden:

from pyspark.sql.functions import row_number, desc 
from pyspark.sql.window import Window 

w = Window.partitionBy(post_tags.EntityID).orderBy(post_tags.Weight) 
newdata=post_tags.withColumn("r", row_number.over(w)).where("r" <= 3) 

ich die folgende Fehlermeldung erhalten:

AttributeError: 'function' object has no attribute 'over' 

Bitte helfen Sie mir auf der gleichen.

+0

Die $ zeigt Fehler. Aber ich fand Antwort von einem anderen Beitrag. 'Von pyspark.sql.window Import Fenster aus pyspark.sql.functions importieren Rang, col Fenster = Window.partitionBy (df [ 'user_id']). OrderBy (df [ 'Score']. Ab()) df.select ('*', rank(). Über (window) .alias ('rank')) .filter (col ('rank') <= 2) .show() ' –

+1

In der' wo ($ "r" <= n) 'Sie haben das' $ 'entfernt, aber nicht durch etwas ersetzt. Versuchen Sie, zu 'col ('r') <= 3 'zu wechseln. – Shaido

Antwort

0

fand ich die Antwort auf diese Frage:

from pyspark.sql.window import Window 
from pyspark.sql.functions import rank, col 

window = Window.partitionBy(df['user_id']).orderBy(df['score'].desc()) 

df.select('*', rank().over(window).alias('rank')) 
    .filter(col('rank') <= 2) 
    .show() 

Credits @mtoto für seine Antwort https://stackoverflow.com/a/38398563/5165377

Verwandte Themen