如何在 spark scala 中标记列的编码?

How to label encode for a column in spark scala?

我有一个非常大的数据框,例如:

    A     B
   a_1   b_1
   a_2   b_2
   a_3   b_3
   a_1   b_4
   a_2   b_4
   a_2   b_2

我想创建对应于 B 的每个唯一值的列,如果 A 的每个唯一值都存在,则将其值设置为 1。预期结果应如下所示

    A     B     C_b_1     C_b_2     C_b_3     C_b_4
   a_1   b_1      1         0         0         1
   a_2   b_2      0         1         0         1
   a_3   b_3      0         0         1         0
   a_1   b_4      1         0         0         1
   a_2   b_4      0         1         0         1
   a_2   b_2      0         1         0         1

解释: 对于 a_1 B 的不同值是 {b_1, b_4} 因此对应于它们的列是设置为 1。对于 a_2,B 的不同值是 {b_2,b_4},因此这些列是 1。对于 a_3.

也是如此

数据非常庞大,预计 'A' 有大约 37000 个不同的值,而 'B' 有大约 370 个。记录数超过 17万.

您可以使用 df.stat.crosstab,并使用 A 列将其连接回原始数据框:

df.join(df.stat.crosstab("A","B").withColumnRenamed("A_B", "A"), "A").show
+---+---+---+---+---+---+
|  A|  B|b_1|b_2|b_3|b_4|
+---+---+---+---+---+---+
|a_3|b_3|  0|  0|  1|  0|
|a_2|b_2|  0|  2|  0|  1|
|a_2|b_4|  0|  2|  0|  1|
|a_2|b_2|  0|  2|  0|  1|
|a_1|b_4|  1|  0|  0|  1|
|a_1|b_1|  1|  0|  0|  1|
+---+---+---+---+---+---+