如何将一列映射到 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])
另一种选择是使用 rdd
和 map()
:
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])
我有一个 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])
另一种选择是使用 rdd
和 map()
:
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 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])