如何传递动态列数?
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|
# +---+----+---+----+
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|
# +---+----+---+----+