Для Spark в Spark ML есть StringIndexer
, который может выполнять кодирование меток для данного столбца. Однако он не может напрямую обработать ситуацию, когда столбец имеет значение переменной длины (или многозначного элемента) . Например,
+-------+--------------------+--------------------+--------------------+--------------------+
| 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
. Мне интересно, есть ли более простые способы сделать это?
Спасибо.