【发布时间】:2019-07-18 13:21:55
【问题描述】:
我的数据是这样的:
+---+---------+
| id|cate_list|
+---+---------+
| 0| a,b,c,d|
| 1| b,c,d|
| 2| a,b|
| 3| a|
| 4|a,b,c,d,e|
| 5| e|
+---+---------+
我想要的是这样的:
-------------------------
| id|cate_list|a|b|c|d|e|
-------------------------
| 0| a,b,c,d|1|1|1|1|0|
| 1| b,c,d|0|1|1|1|0|
| 2| a,b|1|1|0|0|0|
| 3| a|1|0|0|0|0|
| 4|a,b,c,d,e|1|1|1|1|1|
| 5| e|0|0|0|0|1|
-------------------------
我使用了 spark ML OneHotEncoder 并尝试了很多方法,最后我得到了这个:
+---+---------+-------------+-------------+
| id|cate_list|categoryIndex| categoryVec|
+---+---------+-------------+-------------+
| 0| a| 0.0|(4,[0],[1.0])|
| 0| b| 1.0|(4,[1],[1.0])|
| 0| c| 2.0|(4,[2],[1.0])|
| 0| d| 3.0|(4,[3],[1.0])|
| 1| b| 1.0|(4,[1],[1.0])|
| 1| c| 2.0|(4,[2],[1.0])|
| 1| d| 3.0|(4,[3],[1.0])|
| 2| a| 0.0|(4,[0],[1.0])|
| 2| b| 1.0|(4,[1],[1.0])|
| 3| a| 0.0|(4,[0],[1.0])|
| 4| a| 0.0|(4,[0],[1.0])|
| 4| b| 1.0|(4,[1],[1.0])|
| 4| c| 2.0|(4,[2],[1.0])|
| 4| d| 3.0|(4,[3],[1.0])|
| 4| e| 4.0| (4,[],[])|
| 5| e| 4.0| (4,[],[])|
+---+---------+-------------+-------------+
这不是我需要的。当我使用 python 时,它真的很简单,几乎两行代码就可以解决这个问题。 Scala 太难了。
我的代码:
val df_split = df.withColumn("cate_list", explode(split($"cate_list", ",")))
val indexer = new StringIndexer()
.setInputCol("cate_list")
.setOutputCol("categoryIndex")
.fit(df_split)
val indexed = indexer.transform(df_split)
val encoder = new OneHotEncoder()
.setInputCol("categoryIndex")
.setOutputCol("categoryVec")
val encoded = encoder.transform(indexed)
【问题讨论】:
-
请注意,您可以使用 PySpark 编写相同的作业。建议您访问 Spark 网站并查找在 Apache Spark 中执行此操作所需的转换。
-
如果您无法找到解决方案,请在您的 cmets 中提及我。
-
如果我可以问,你为什么要这样做?您最终将需要一个向量来使用 spark-ml 进行训练?
-
你能分享你的代码吗?
-
@BrianMcCutchon 我编辑了它。
标签: scala apache-spark one-hot-encoding