6

Ho creato con successo uno row_number()partitionBy in Spark usando Window, ma vorrei ordinare questo in ordine decrescente, invece del default crescente. Qui è il mio codice di lavoro:Spark SQL Row_number() PartitionBy Sort Desc

from pyspark import HiveContext 
from pyspark.sql.types import * 
from pyspark.sql import Row, functions as F 
from pyspark.sql.window import Window 

data_cooccur.select("driver", "also_item", "unit_count", 
    F.rowNumber().over(Window.partitionBy("driver").orderBy("unit_count")).alias("rowNum")).show() 

che mi dà questo risultato:

+------+---------+----------+------+ 
|driver|also_item|unit_count|rowNum| 
+------+---------+----------+------+ 
| s10|  s11|   1|  1| 
| s10|  s13|   1|  2| 
| s10|  s17|   1|  3| 

E qui aggiungo il disc() per ordine decrescente:

data_cooccur.select("driver", "also_item", "unit_count", F.rowNumber().over(Window.partitionBy("driver").orderBy("unit_count").desc()).alias("rowNum")).show() 

E ottenere questo errore:

AttributeError: 'WindowSpec' object has no attribute 'desc'

Cosa devo fare g sbagliato qui?

+0

Sul mio PySpark (2.2.0) devo usare 'row_number' invece di' rowNumber'. – lambruscoAcido

risposta

12

desc deve essere applicato su una colonna e non su una definizione di finestra. È possibile utilizzare un metodo su una colonna:

from pyspark.sql.functions import col 

F.rowNumber().over(Window.partitionBy("driver").orderBy(col("unit_count").desc()) 

o una funzione autonoma:

from pyspark.sql.functions import desc 

F.rowNumber().over(Window.partitionBy("driver").orderBy(desc("unit_count"))