Python PySpark DataFrame:根据列值获取按行排序的列名
我是PySpark的初学者,正在为我的问题寻找解决方案。实际上,我想按列名对我的列名进行排序 我的PySpark数据框如下所示:Python PySpark DataFrame:根据列值获取按行排序的列名,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我是PySpark的初学者,正在为我的问题寻找解决方案。实际上,我想按列名对我的列名进行排序 我的PySpark数据框如下所示: +---+---+---+---+ | ID| a| b| c| +---+---+---+---+ | 0| 5| 2| 1| | 1| 3| 4| 5| +---+---+---+---+ 并应按以下格式进行排序: +---+---+---+---+ | ID| p1| p2| p3| +---+---+---+---+ | 0| a|
+---+---+---+---+
| ID| a| b| c|
+---+---+---+---+
| 0| 5| 2| 1|
| 1| 3| 4| 5|
+---+---+---+---+
并应按以下格式进行排序:
+---+---+---+---+
| ID| p1| p2| p3|
+---+---+---+---+
| 0| a| b| c|
| 1| c| b| a|
+---+---+---+---+
我试过几种方法来分类,但都不起作用。我希望你能帮助我。因为我不知道你的spark版本,我假设它低于2.4。 因此,我将使用UDF来执行该任务
从pyspark.sql导入函数为F,类型为T
@F.udf(T.ArrayType(T.StringType()))
def排序数组(在数组中):
in_array.sort(key=lambda x:x[1],reverse=True)
返回[i[0]表示数组中的i]
df.withColumn(
“a”、F.阵列(F.照明(“a”)、F.颜色(“a”))
).withColumn(
“b”、F阵列(F光(“b”)、F色(“b”))
).withColumn(
“c”、F.阵列(F.照明(“c”)、F.颜色(“c”))
).withColumn(
“数据”、F数组(F列(“a”)、F列(“b”)、F列(“c”))
).withColumn(
“prio”,排序数组(F.col(“数据”))
).选择(
“身份证”,
F.col(“prio”).getItem(0).别名(“p1”),
F.col(“prio”).getItem(1).别名(“p2”),
F.col(“prio”).getItem(2).别名(“p3”),
).show()
+---+---+---+---+
|ID | p1 | p2 | p3|
+---+---+---+---+
|0 | c | b | a|
|1 | a | b | c|
+---+---+---+---+
编辑:动态模式
@F.udf(T.ArrayType(T.StringType()))
def排序数组(在数组中):
in_array.sort(key=lambda x:x[1],reverse=True)
返回[i[0]表示数组中的i]
col_list=[col for col in df.columns if col!=“ID”]
df.withColumn(
“数据”,F.array(*(F.array(F.lit(col),F.col(col))表示col_列表中的col))
).withColumn(
“prio”,排序数组(F.col(“数据”))
).选择(
“ID”*(F.col(“prio”).getItem(i).别名(F“p{i+1}”)表示范围内的i(len(col_列表)))
).show()
试试这个-
在scala中,但可以在python中使用。变化很小
spark>=2.4
df.show(假)
df.printSchema()
/**
* +---+---+---+---+
*| ID | a | b | c|
* +---+---+---+---+
* |0 |5 |2 |1 |
* |1 |3 |4 |5 |
* +---+---+---+---+
*
*根
*|--ID:integer(nullable=true)
*|--a:整数(可为空=真)
*|--b:整数(可空=真)
*|--c:整数(可为空=真)
*/
val ignoredCol=“ID”
val columns=df.columns.filterNot(==ignoredCol).map(c=>struct(col(c).as(“val”)、lit(c).as(“name”))
val l=列的长度
val p=df.withColumn(“arr”,数组\排序(数组(列:\*))
.选择(列(ignoredCol)+:
Range(0,l).map(i=>$“arr”.getItem(i).getField(“name”).as(s“p${l-i}”):*)
p、 显示(假)
p、 printSchema()
/**
* +---+---+---+---+
*| ID | p3 | p2 | p1|
* +---+---+---+---+
*| 0 | c | b | a|
*| 1 | a | b | c|
* +---+---+---+---+
*
*根
*|--ID:integer(nullable=true)
*|--p3:字符串(nullable=true)
*|--p2:字符串(nullable=true)
*|--p1:字符串(nullable=true)
*/
您的spark版本是什么?我使用的是spark最新版本3.0,感谢您的回答,我将测试它并尝试理解!!不,spark data Framework我们能不能让它有点动态,我们可以应用在任何df上