如何获取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如果解决了您的问题,请不要忘记:)