У меня есть фрейм данных df, который выглядит так:
+--------+--------------------+
| user_id| is_following|
+--------+--------------------+
| 1|[2, 3, 4, 5, 6, 7] |
| 2|[20, 30, 40, 50] |
+--------+--------------------+
Я могу подтвердить, что это схема:
root
|-- user_id: integer (nullable = true)
|-- is_following: array (nullable = true)
| |-- element: integer (containsNull = true)
Я хотел бы использовать процедуры машинного обучения Spark, такие как LDA, чтобы провести машинное обучение по этому поводу, требуя от меня преобразования столбца is_following
в linalg.Vector
(не вектор Scala). Когда я пытаюсь сделать это через
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.linalg.Vectors
val assembler = new VectorAssembler().setInputCols(Array("is_following")).setOutputCol("features")
val output = assembler.transform(df)
Затем я получаю следующую ошибку:
java.lang.IllegalArgumentException: Data type ArrayType(IntegerType,true) is not supported.
Если я интерпретирую это правильно, я убираю из этого, что мне нужно преобразовать здесь типы из целых чисел в что-то еще. (Двойная? Строка?)
У меня вопрос: как лучше всего преобразовать этот массив во что-то, что будет правильно векторизоваться для конвейера ML?
РЕДАКТИРОВАТЬ: Если это поможет, мне не нужно таким образом структурировать фрейм данных. Я мог бы вместо этого сделать это:
+--------+------------+
| user_id|is_following|
+--------+------------+
| 1| 2|
| 1| 3|
| 1| 4|
| 1| 5|
| 1| 6|
| 1| 7|
| 2| 20|
| ...| ...|
+--------+------------+
VectorAssembler
, но получил аналогичную ошибку:java.lang.IllegalArgumentException: Data type ArrayType(DoubleType,true) is not supported.
Я также могу преобразовать столбецis_following
в удвоение из отредактированного фрейма данных (то есть с несколькими идентичнымиuser_id
строками), но это не совсем то, что Я хочу, так как мне нужно передавать массив значений, а не одно значение за раз. - person CJ Sullivan   schedule 18.10.2017