将多标签列转换为 pyspark 中的多列?

Convert a multi-label column to multiple columns in pyspark?

我有一个像这样的 pyspark 数据框-

这是我要解决的问题的简化版本。事实上,"label" 列在一行中可能有多达 20 个项目(将是字符串)。现在我们只有 3 个选项可供选择,即 0、1 和 2。

对于图中所示的问题,我想要的是另外三列——label_0、label_1和label_2。例如,table 转换后会变成这样。

这可能看起来类似于进行单热编码。我发现在 pyspark 中很难做到这一点。

对于Spark2.4+,你可以试试这个。

labels=['0','1','2']

from pyspark.sql import functions as F
df.withColumn("struct", F.struct(*[(F.struct(F.expr("size(filter(label,x->x={}))"\
                                                    .format("'"+y+"'"))).alias(y)) for y in labels]))\
            .select("id",*[F.col("struct.{}.col1".format(x)).alias('label'+x) for x in labels]).show()

#+---+------+------+------+
#| id|label0|label1|label2|
#+---+------+------+------+
#|  0|     0|     1|     1|
#|  1|     1|     1|     0|
#|  2|     1|     1|     0|
#|  3|     1|     1|     0|
#+---+------+------+------+