Spark DataFrame拆分元素数量可变列生成多列的实现问题
Spark DataFrame 新增Status与Code列实现方案
完全不需要修改原数据集,直接基于你已经拆分得到的数组列LongColumn即可实现需求,以下是扩展后的完整代码:
from pyspark.sql import functions as F # 基于原有代码扩展新增列 out_df = (df .withColumn('LongColumn', F.split('LongColumn', '\.')) # 新增Code列:取拆分后数组的第二个元素(数组索引从0开始,对应索引1) .withColumn('Code', F.col('LongColumn')[1]) # 新增Status列:判断数组中是否包含"approved" .withColumn('Status', F.when(F.array_contains(F.col('LongColumn'), 'approved'), 'approved') .otherwise('unapproved')) # 原有逻辑保留的列 .withColumn('Category', F.expr('LongColumn[size(LongColumn) - 4]')) .withColumn('Letter', F.expr('LongColumn[size(LongColumn) - 3]')) .withColumn('dataset', F.expr('LongColumn[size(LongColumn) - 2]')) # 删除临时的数组列LongColumn .drop('LongColumn'))
代码逻辑说明:
- Code列:拆分后的数组索引从0开始,第二个元素对应索引
1,直接通过F.col('LongColumn')[1]取值即可。 - Status列:利用Spark内置函数
array_contains判断数组中是否存在approved,结合when-otherwise实现条件赋值,无需关心approved的具体位置。
最终输出结果:
| Code | Status | Category | Letter | dataset |
|---|---|---|---|---|
| ABC | approved | Category1 | Beta | MyResults |
| DEF | unapproved | Category2 | Alpha | MyResults |
| ABC | unapproved | Category6 | Gamma | MyResults |
| GHI | approved | Category1 | Alpha | MyResults |
内容的提问来源于stack exchange,提问作者johnnydoe
相关产品推荐
相关产品推荐

