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

时间:2018-03-19 22:29:24

标签: python apache-spark pyspark apache-spark-sql spark-dataframe

我有一个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")方法,但如何在一列中同时创建多个列通过拆分函数映射?

2 个答案:

答案 0 :(得分:2)

你可以尝试

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])

答案 1 :(得分:2)

另一种选择是使用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 answer在循环中使用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])