apache-spark - 如何在 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 编码吗?
解决方案
可以拆分列“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 |
+---+---+---+---+
推荐阅读
- r - R:对靠近指定位置的单元格采样矩阵
- vue.js - 将多个类绑定到单个变量
- swift - SwiftUI 文本视图不显示不可显示的字符
- ruby-on-rails - 何时在 Rails 6 中使用 stylesheet_pack_tag 而不是 stylesheet_link_tag
- java - 如何使用 JSONArray 构建 JSONObject?
- java - 二进制 XML 文件第 24 行:膨胀类 com.google.android.material.navigation.NavigationView 时出错
- python - 如何导出/打印每个观察的分类器详细输出?
- node.js - 如何在 MERN 堆栈中使用 passport.js 和 google auth 实现基于令牌的身份验证
- javascript - vue.js 中的“[Violation] 'click' 处理程序耗时 43665 毫秒”
- python - 转换为 dict/type 列表,包含字符串列表的字符串列表?