python - 如何在pyspark中分解数据框的多列
问题描述
我有一个数据框,其中包含类似于以下列的列表。所有列中列表的长度都不相同。
Name Age Subjects Grades
[Bob] [16] [Maths,Physics,Chemistry] [A,B,C]
我想以得到以下输出的方式分解数据框 -
Name Age Subjects Grades
Bob 16 Maths A
Bob 16 Physics B
Bob 16 Chemistry C
我怎样才能做到这一点?
解决方案
PySparkarrays_zip
在 2.4 中添加了一个函数,它消除了使用 Python UDF 压缩数组的需要。
import pyspark.sql.functions as F
from pyspark.sql.types import *
df = sql.createDataFrame(
[(['Bob'], [16], ['Maths','Physics','Chemistry'], ['A','B','C'])],
['Name','Age','Subjects', 'Grades'])
df = df.withColumn("new", F.arrays_zip("Subjects", "Grades"))\
.withColumn("new", F.explode("new"))\
.select("Name", "Age", F.col("new.Subjects").alias("Subjects"), F.col("new.Grades").alias("Grades"))
df.show()
+-----+----+---------+------+
| Name| Age| Subjects|Grades|
+-----+----+---------+------+
|[Bob]|[16]| Maths| A|
|[Bob]|[16]| Physics| B|
|[Bob]|[16]|Chemistry| C|
+-----+----+---------+------+
推荐阅读
- java - 用asm如何显式声明一个可变参数
- sql - 需要简单的方法来查找开始日期和结束日期之间的持续时间
- ios - 当我将 UIView 动画放在不同类的 containerView 中时,为什么我的 UIView 动画不起作用?
- java - 如何使用 Thymeleaf 集成共享布局并在项目中的所有 html 页面中使用该布局?
- php - Laravel lumen 使用门在控制器中调用多个授权
- ios - 象征性崩溃报告目标-C
- azure - Azure ARM 模板 - 资源类型 Microsoft.Web/serverFarms sku 容量设置为最小值导致问题
- r - R Shiny:使用DT包编辑下拉列表中的表格并更新表格并输出为CSV文件
- oozie - Oozie 属性文件值未从 spark 读取
- c++ - 将 const char 转换为 std::string 以获得标题