如何将一列映射到 pyspark 中的多列?

How do I map one column to multiple columns in pyspark?

我有一个 pyspark 数据框,如下所示:

df.show()
+---+
|dim|
+---+
|1x1|
|0x0|
|1x0|
+---+

dim中的数据类型为str。现在我想将 dim 分成 2 列,并且有这样的东西:

df.show()
+---+----+----+
|dim|dim1|dim2|
+---+----+----+
|1x1|   1|   1|
|0x0|   0|   0|
|1x0|   1|   0|
+---+----+----+

我知道,如果我要对单个字符串进行操作,我只会使用 python 中的 split() 方法:"1x1".split("x"),但是如何同时创建多个列作为通过拆分函数映射的一列的结果?

你可以试试

from pyspark.sql.functions import split
df_temp = df.withColumn("dim1", split("dim", "x")[0])
df_new = df_temp.withColumn("dim2", split("dim", "x")[1])
df_new.show()

或者您可以在一次调用中将它们链接在一起:

df_new = df.withColumn("dim1", split("dim", "x")[0])\
    .withColumn("dim2", split("dim", "x")[1])

另一种选择是使用 rddmap():

df = df.rdd.map(lambda row: (row['dim'],) + tuple(row['dim'].split('x')))\
    .toDF(["dim", "dim1", "dim2"])
df.show()
#+---+----+----+
#|dim|dim1|dim2|
#+---+----+----+
#|1x1|   1|   1|
#|0x0|   0|   0|
#|1x0|   1|   0|
#+---+----+----+

这里是 @Grace O'Halloran's using pyspark.sql.functions.split() 在一个循环中的改编,而不是枚举可能性(如果你有大量维度,这很有用):

ndim = 2
import pyspark.sql.functions as f
for d in range(ndim):
    df = df.withColumn('dim{}'.format(d+1), f.split('dim', 'x')[d])