如何传递动态列数?

How to pass dynamic number of columns?

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'])

原样:

df.withColumn(
        "rank", row_number().over(Window.partitionBy("type").orderBy(col("cnt").desc(), col("id").desc()))
    ).head(10)

成为。我想制作方法

def rank(df, order):
    df.withColumn(
        "rank", row_number().over(Window.partitionBy("type").orderBy(order))
    ).head(10) 

我想传递多个列进行排序 (col("cnt").desc(), col("id").desc())。 如果只有一列,那很简单,但我应该制作一种可扩展的方法(以接受更多列)。怎么做?

++) 如果我想要另一个动态参数,如何解决?

def rank(df, ?, *order):
    df = df.withColumn("rank", row_number().over(Window.partitionBy(?).orderBy(*order))
    )
    return df

尝试使用 *order

而不是 order

我不确定你想做什么,但你的 rank 函数的以下修改版本似乎适用于提供的不同数字列。

def rank(df, *order):
    df = df.withColumn(
        "rank", row_number().over(Window.partitionBy("type").orderBy(*order))
    )
    return df
rank(df, asc("id")).show()
# +---+----+---+----+
# | id|type|cnt|rank|
# +---+----+---+----+
# |100|  a_|  1|   1|
# |110|  a_|  6|   2|
# |150|  a_|  6|   3|
# |200|  a_|  6|   4|
# |120|  b_|  2|   1|
# |130|  b_|  6|   2|
# |140|  b_| 12|   3|
# |220|  c_|  3|   1|
# |230|  d_|  4|   1|
# |500|  e_|  5|   1|
# +---+----+---+----+

rank(df, col("cnt").desc(), col("id").desc()).show()
# +---+----+---+----+
# | id|type|cnt|rank|
# +---+----+---+----+
# |200|  a_|  6|   1|
# |150|  a_|  6|   2|
# |110|  a_|  6|   3|
# |100|  a_|  1|   4|
# |140|  b_| 12|   1|
# |130|  b_|  6|   2|
# |120|  b_|  2|   3|
# |220|  c_|  3|   1|
# |230|  d_|  4|   1|
# |500|  e_|  5|   1|
# +---+----+---+----+