df = spark.createDataFrame(
[[100,'a_',1],
[150,'a_',6],
[200,'a_',6],
[120,'b_',2],
[220,'c_', 3],
[230,'d_', 4],
[500,'e_',5],[
110,'a_',6],
[130,'b_',6],
[140,'b_',12]], ['id','type','cnt'])
As is:
df.withColumn(
"rank", row_number().over(Window.partitionBy("type").orderBy(col("cnt").desc(), col("id").desc()))
).head(10)
To be. I want to make method
def rank(df, order):
df.withColumn(
"rank", row_number().over(Window.partitionBy("type").orderBy(order))
).head(10)
I want to pass multiple columns for ordering (col("cnt").desc(), col("id").desc()).
If there's just one column, that's simple, but I should make a scalable method (to accept more columns). How to do it?
++) If I want to another dynamic parameter, how to fix it?
def rank(df, ?, *order):
df = df.withColumn("rank", row_number().over(Window.partitionBy(?).orderBy(*order))
)
return df