Apache spark 如何在pyspark中动态地将一列转换为多行?
我有一个如下所示的数据框 科尔曼 A. B C D E F G H 我 J K LApache spark 如何在pyspark中动态地将一列转换为多行?,apache-spark,pyspark,pivot,transpose,Apache Spark,Pyspark,Pivot,Transpose,我有一个如下所示的数据框 科尔曼 A. B C D E F G H 我 J K L 您可以添加一些辅助列来透视数据帧: import pyspark.sql.functions as F x = 3 result = df.withColumn( 'id', F.monotonically_increasing_id() ).withColumn( 'id2', (F.col('id') / x).cast('int') ).withColumn( '
您可以添加一些辅助列来透视数据帧:
import pyspark.sql.functions as F
x = 3
result = df.withColumn(
'id',
F.monotonically_increasing_id()
).withColumn(
'id2',
(F.col('id') / x).cast('int')
).withColumn(
'id3',
F.col('id') % x
).groupBy('id2').pivot('id3').agg(F.first('ColName')).orderBy('id2').drop('id2')
result.show()
+---+---+---+
| 0| 1| 2|
+---+---+---+
| a| b| c|
| d| e| f|
| g| h| i|
| j| k| l|
+---+---+---+
您可以结合使用
收集列表
和行编号
来实现此目的
步骤1:生成自定义行号
from pyspark.sql.functions import floor, row_number, collect_list
from pyspark.sql.window import Window
no_of_columns = 3
df2 = df.withColumn("row_num", floor((row_number().over(Window.orderBy("ColName"))-1)/no_of_columns))
步骤2:使用此行号对数据分组,并使用收集列表
创建列表
df3 = df2.groupBy("row_num").agg(collect_list("ColName").alias("col_list"))
步骤3:使用python的列表理解从列表中选择所有元素
df3.select(*[df3.col_list[i].alias(f"col{i+1}") for i in range(no_of_columns)]).show()
输出:
+----+----+----+
|col1|col2|col3|
+----+----+----+
| a| b| c|
| d| e| f|
| g| h| i|
| j| k| l|
+----+----+----+
注意:参数
no\u of_columns
可以根据所需的输出列数进行更改。如果“x”的值是参数化的,并且可以根据调用该代码的人进行更改,则该参数是否有效?是的,您可以尝试更改x的值,只要其值合理,该参数仍然有效