对于 Spark,StringIndexer
Spark ML 中有一个可以对给定列进行标签编码。但是它不能直接处理列是可变长度特征(或多值特征)的情况。例如,
+-------+--------------------+--------------------+--------------------+--------------------+
| jobid| country_list| typeofwork_list| publish| expire|
+-------+--------------------+--------------------+--------------------+--------------------+
|1636051|USA;Spain;China;A...|1441;1442;1443 |27/03/2017 2:00:0...|3/04/2017 1:59:59 PM|
|1636052|USA;Spain;Japan;A...|1441;1442 |27/03/2017 2:00:0...|3/04/2017 1:59:59 PM|
|1636053|UK;Spain;China;A....|1442;1443 |27/03/2017 2:00:0...|3/04/2017 1:59:59 PM|
|1636054|USA;Spain;China;A...|1443 |27/03/2017 2:00:0...|3/04/2017 1:59:59 PM|
和 country_list
列typeofwork_list
是可变长度特征。它们在一列中可以有多个值,并且值的数量是可变的。当我想对它们进行标签编码时,我不能StringIndexer
直接在这些列上使用。
以country_list
列为例,我需要的结果如下:
+--------------------+
| country_list|
+--------------------+
|0;1;2;3... |
|0;1;4;3... |
|5;1;2;3... |
|0;1;2;3... |
在 Spark 中对此类列进行标签编码的最佳方法是什么?
我想的一种方法是首先explode
进入country_list
一个单列数据帧,然后StringIndexer
在这个临时数据帧上进行标签编码()。在那之后dropDulicate
,然后collect
它,现在我应该有映射了。然后我可以broadcast
映射到所有工作机器。原始 Dataframe 可以使用UDF
包装映射来转换country_list
列。我想知道有没有更简单的方法可以做到这一点?
谢谢你。