Преобразование Pyspark из столбца вектора в тип doubleType - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть столбец векторного типа с одним значением в каждом векторе.Я хочу получить только это значение и сохранить столбец как doubleType.

пример ввода df:

|testcol|
[1.3]|
[1.2]|
[3.4]|

желаемый вывод df:

|testcol|
|1.3|
|1.2|
|3.4|

Код, который у меня естьдо сих пор:

remove_vector_func = udf(lambda x: list(x)[0], DoubleType())
ex= ex.withColumn("testcol", remove_vector_func("testcol"))

Этот код выполняется, но когда я пытаюсь показать столбец, он продолжает выдавать ошибку:

ожидаемый нулевой аргумент для построения ClassDict (для numpy.dtype)

В printSchema () я вижу, что тип столбца правильный:

testcol: double (nullable = true)

1 Ответ

0 голосов
/ 09 июля 2019

Вам просто нужно убедиться, что ваша лямбда-функция возвращает объект, который соответствует типу возврата вашего UDF.В этом случае вам необходимо преобразовать объект в тип с плавающей запятой

Код:

from pyspark.ml.linalg import Vectors
from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType

ex = spark.createDataFrame([[1.3],
                            [1.2],
                            [3.4]
                           ], ["test"])

from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(inputCols=["test"],outputCol="testcol")
ex = assembler.transform(ex)
ex.show(5)

# UDF for converting column type from vector to double type
unlist = udf(lambda x: float(list(x)[0]), DoubleType())

ex = ex.withColumn("testcol_new", unlist("testcol"))
ex.show(5)

Вывод:

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...