Pyspark 将字符串列的Spark数据框拆分为多个布尔列
我们的spark数据框如下所示:Pyspark 将字符串列的Spark数据框拆分为多个布尔列,pyspark,Pyspark,我们的spark数据框如下所示: id | value ------+-------- 0 | A,B 1 | A,C 2 | B 我们希望将其转化为: id | A | B | C ------+-------+-------+-------+ 0 | True | True | False | 1 | True | False | True | 2 | False | True | False |
id | value
------+--------
0 | A,B
1 | A,C
2 | B
我们希望将其转化为:
id | A | B | C
------+-------+-------+-------+
0 | True | True | False |
1 | True | False | True |
2 | False | True | False |
进行这种转换的最佳方法是什么?以下是Scala的一种方法: val df=Seq 0,A,B,, 1,A,C,, 2,B .toDFid,value //存储来自拆分的数组 val withArrayDF=df.withColumnarray,拆分$value,.dropvalue //获取整个数据集的排序唯一值 val distinctValues=withArrayDF.selectexplode$array.distinct.collect.map{{{uu.getString0}.sorted.toList //为每个A、B、C创建名为ncol的新列。当ncol出现在arrayi中时,为真,否则为假 distinctValues.map{ncol=> withArrayDF.WithColumnCol,数组_包含$array,ncol.droparray }.reduce\u.join\u,id//join所有A、B、C .selectid,distinctValue:_* 显示 以及输出:
+---+-----+-----+-----+
| id| A| B| C|
+---+-----+-----+-----+
| 0| true| true|false|
| 1| true|false| true|
| 2|false| true|false|
+---+-----+-----+-----+
python版本:
从pyspark.sql.functions导入数组_contains、split、when、col、explode
从functools导入reduce
df=spark.createDataFrame
[0,A,B,
1,A,C,,
2,B],[id,值]
存储来自拆分的数组
withArrayDF=df.withColumnarray,splitdf[value],.dropvalue
获取整个数据集的排序唯一值
distinctValues=已排序
列表
maplambda行:行[0],withArrayDF.selectexplodearray.distinct.collect
为每个A、B、C创建名为ncol的新列。当ncol出现在arrayi中时,为真,否则为假
mappedDFs=列表
maplambda ncol:
随手
.WithColumnCol,数组_包含数组,ncol
.droparray,
区分价值
finalDF=还原lambda x,y:x.joiny,id,mappedDFs
最后的演出
输出:
+---+-----+-----+-----+
| id| A| B| C|
+---+-----+-----+-----+
| 0| true| true|false|
| 1| true|false| true|
| 2|false| true|false|
+---+-----+-----+-----+
假设它是您的输入数据帧:
df = spark.createDataFrame([(0,["A","B"]),(1,["A","C"]),(2, ["B"])],["id","value"])
然后使用explode&pivot获得一个包含int和null的表
df2 = df.withColumn("x",explode(df.value)).drop("value").groupBy("id").pivot("x").count()
df2.show()
+---+----+----+----+
| id| A| B| C|
+---+----+----+----+
| 0| 1| 1|null|
| 1| 1|null| 1|
| 2|null| 1|null|
+---+----+----+----+
最后,您只需将值转换为布尔值,例如:
for col_name in df2.columns[1:]:
df2 = df2.withColumn(col_name, col(col_name).isNotNull())
df2.show()
+---+-----+-----+-----+
| id| A| B| C|
+---+-----+-----+-----+
| 0| true| true|false|
| 1| true|false| true|
| 2|false| true|false|
+---+-----+-----+-----+