Pyspark 将字符串列的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 |

我们的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 | 

进行这种转换的最佳方法是什么?

以下是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|
+---+-----+-----+-----+