Мои данные таковы:
+---+---------+
| 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, это действительно просто, и почти двухстрочный код может решить эту проблему.Скала слишком сложная.
Мой код:
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)