Преобразование вывода в float
:
from pyspark.sql.types import DoubleType
from pyspark.sql.functions import lit, udf
def ith_(v, i):
try:
return float(v[i])
except ValueError:
return None
ith = udf(ith_, DoubleType())
Пример использования:
from pyspark.ml.linalg import Vectors
df = sc.parallelize([
(1, Vectors.dense([1, 2, 3])),
(2, Vectors.sparse(3, [1], [9]))
]).toDF(["id", "features"])
df.select(ith("features", lit(1))).show()
## +-----------------+
## |ith_(features, 1)|
## +-----------------+
## | 2.0|
## | 9.0|
## +-----------------+
Объяснение:
Выходные значения должны быть перезаписаны до эквивалента Java-объекты. Если вы хотите получить доступ к values
(остерегайтесь SparseVectors
), вы должны использовать метод item
:
v.values.item(0)
, которые возвращают стандартные скаляры Python. Аналогично, если вы хотите получить доступ ко всем значениям в виде плотной структуры:
v.toArray().tolist()