Ваш столбец функций не является типом массива. Сначала вам нужно преобразовать его в массив.
Вы можете снять квадратные скобки и разбить строку, чтобы получить массив.
df = df.withColumn("features", split(expr("rtrim(']', ltrim('[', features))"), ","))
Теперь у вас есть массив строк, где каждый элемент похож на массив, поэтому вам нужно будет также преобразовать каждый элемент в массив. Для Spark 2.4+ вы можете сделать это с помощью функции transform
:
df = df.withColumn("features", expr("transform(features, x -> split(rtrim(']', ltrim('[', x)), ','))"))
Наконец, сгладьте внутренние массивы, приведите элементы строк к плавающим и конвертируйте в вектор:
from pyspark.ml.linalg import VectorUDT
from pyspark.ml.linalg import Vectors
array_to_vector = udf(lambda a: Vectors.dense(a), VectorUDT())
df = df.withColumn("features", flatten(col("features")).cast("array<float>"))\
.withColumn("features", array_to_vector(col("features")))
df.printSchema()
#root
# |-- id: long (nullable = true)
# |-- features: vector (nullable = true)
Собираем все вместе:
df = df.withColumn("features", split(expr("rtrim(']', ltrim('[', features))"), ",")) \
.withColumn("features", expr("""transform(features, x -> split(rtrim(']', ltrim('[', x)), ","))"""))\
.withColumn("features", flatten(col("features")).cast("array<float>"))\
.withColumn("features", array_to_vector(col("features")))