在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
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