首页 > 解决方案 > 如何在 Spark 中对具有逗号分隔值的字符串列执行一次热编码?

问题描述

我有一个看起来像这样的数据框

val df = Seq(
(1,"a,b,c"),
(2,"b,c")
).toDF("id","page_path")
df.createOrReplaceTempView("df")

df.show()


+---+---------+
| id|page_path|
+---+---------+
|  1|    a,b,c|
|  2|      b,c|
+---+---------+

我想在这个 page_path 列上执行一个热编码,使得输出看起来像 -

输出

我可以在 Spark 中使用 one-hot 编码吗?

标签: apache-spark

解决方案


可以拆分列“page_path”,然后将值分解和旋转:

 df
  .withColumn("splitted", split($"page_path",","))
  .withColumn("exploded", explode($"splitted"))
  .groupBy("id")
  .pivot("exploded")
  .count()
  // replace nulls with 0
  .na.fill(0)

输出:

+---+---+---+---+
|id |a  |b  |c  |
+---+---+---+---+
|1  |1  |1  |1  |
|2  |0  |1  |1  |
+---+---+---+---+

推荐阅读