在pyspark中拆分相应的列值

Split corresponding column values in pyspark

table 下方是输入数据帧

col1 col2 col3
1 12;34;56 Aus;SL;NZ
2 31;54;81 Ind;US;UK
3 null Ban
4 Ned null

预期的输出数据帧[col2 和 col3 的值应由 ;相应地]

col1 col2 col3
1 12 Aus
1 34 SL
1 56 NZ
2 31 Ind
2 54 US
2 81 UK
3 null Ban
4 Ned null

您可以使用 pyspark 函数 split() 将具有多个值的列转换为数组,然后使用函数 explode() 从不同的值中生成多行。

它可能看起来像这样:

df = df.withColumn("<columnName>", explode(split(df.<columnName>, ";")))

如果你想保留 NULL 值,你可以使用 explode_outer().

如果您希望多个分解数组的值在行中匹配,您可以使用 posexplode() 然后 filter() 到位置对应的行。

下面的代码工作得很好


data = [(1,'12;34;56', 'Aus;SL;NZ'),
        (2,'31;54;81', 'Ind;US;UK'),
        (3,None, 'Ban'),
        (4,'Ned', None) ]
  
columns = ['Id', 'Score','Countries']
df = spark.createDataFrame(data, columns) 
#df.show()

df2=df.select("*",posexplode_outer(split("Countries",";")).alias("pos1","value1"))
#df2.show()

df3=df2.select("*",posexplode_outer(split("Score",";")).alias("pos2","value2"))
#df3.show()

df4=df3.filter((df3.pos1==df3.pos2) | (df3.pos1.isNull() | df3.pos2.isNull()))
df4=df4.select("Id","value2","value1")
df4.show()  #Final Output