Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark DataFrame:根据列值获取按行排序的列名_Python_Apache Spark_Pyspark - Fatal编程技术网

Python PySpark DataFrame:根据列值获取按行排序的列名

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|

我是PySpark的初学者,正在为我的问题寻找解决方案。实际上,我想按列名对我的列名进行排序

我的PySpark数据框如下所示:

+---+---+---+---+
| 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上