如何获取Pyspark中每行具有前3个最大值的列名

如何获取Pyspark中每行具有前3个最大值的列名,pyspark,Pyspark,示例数据帧 id a1 a2 a3 a4 a5 a6 0 5 23 4 1 4 5 1 6 43 2 2 98 43 2 3 56 3 1 23 3 3 2 2 6 3 5 2 4 5 6 7 2 7 5 我需要这样 top1 top2 top3 a2 a1 a6 a5 a2 a6 希望这有帮助 从pyspark.sql.functions导入col、u

示例数据帧

id  a1  a2  a3  a4  a5  a6
0   5  23   4   1   4   5
1   6  43   2   2   98   43
2   3  56   3   1  23   3
3   2   2   6   3   5   2
4   5   6   7   2   7   5
我需要这样

top1 top2 top3
a2   a1   a6
a5   a2   a6
希望这有帮助

从pyspark.sql.functions导入col、udf、数组、sort\u数组
从pyspark.sql.types导入StringType
df=sc.parallelize([(0,5,23,4,1,4,5),
(1, 6, 43, 2, 2, 98, 43),
(2, 3, 56, 3, 1, 23, 3),
(3, 2, 2, 6, 3, 5, 2),
(4, 5, 6, 7, 2, 7, 5)]).\
toDF([“id”、“a1”、“a2”、“a3”、“a4”、“a5”、“a6”])
df_col=df.columns
df=df\
withColumn(“top1_val”,sort_数组(数组([col(x)表示df_col[1:]),asc=False)[0])\
withColumn(“top2_val”,sort_数组(数组([col(x)表示df_col[1:]),asc=False)[1])\
withColumn(“top3_val”,sort_数组(数组([col(x)表示df_col[1:]),asc=False)[2])
def修改值(r,最大值):
l=[]
对于范围内的i(len(df_col[1:]):
如果r[i]==max\u col:
l、 追加(df_col[i+1])
返回l
修改\u值\u udf=udf(修改\u值,StringType())
df1=df\
使用列(“top1”,修改_值_udf(数组(df.columns[1:-3]),“top1_值”)\
使用列(“top2”,修改_值_udf(数组(df.columns[1:-3]),“top2_值”)\
使用列(“top3”,修改_值_udf(数组(df.columns[1:-3]),“top3_值”))
df1.show()
输出为:

+---+---+---+---+---+---+---+--------+--------+--------+--------+--------+------------+
| id| a1| a2| a3| a4| a5| a6|top1_val|top2_val|top3_val|    top1|    top2|        top3|
+---+---+---+---+---+---+---+--------+--------+--------+--------+--------+------------+
|  0|  5| 23|  4|  1|  4|  5|      23|       5|       5|    [a2]|[a1, a6]|    [a1, a6]|
|  1|  6| 43|  2|  2| 98| 43|      98|      43|      43|    [a5]|[a2, a6]|    [a2, a6]|
|  2|  3| 56|  3|  1| 23|  3|      56|      23|       3|    [a2]|    [a5]|[a1, a3, a6]|
|  3|  2|  2|  6|  3|  5|  2|       6|       5|       3|    [a3]|    [a5]|        [a4]|
|  4|  5|  6|  7|  2|  7|  5|       7|       7|       6|[a3, a5]|[a3, a5]|        [a2]|
+---+---+---+---+---+---+---+--------+--------+--------+--------+--------+------------+

你已经试过什么了?。这篇文章可以让你开始,一旦你尝试了这个,就发布你的查询。我厌倦了pyspark.sql.functions.greatest()。。。。但它返回的是列表中的最大值,而不是列名。@SPR如果解决了您的问题,请不要忘记:)