#python #python-3.x #apache-spark #pyspark #apache-spark-sql
#python #python-3.x #apache-spark #pyspark #apache-spark-sql
Вопрос:
Мне нужно добавить массив NumPy в фрейм данных PySpark.
Результат должен быть таким, добавляя var38mc
переменную:
---- ------ ------------- -------
| ID|TARGET| var38|var38mc|
---- ------ ------------- -------
| 1.0| 0.0| 117310.9790| True|
| 3.0| 0.0| 39205.17000| False|
| 4.0| 0.0| 117310.9790| True|
---- ------ ------------- -------
Во-первых, я вычислил массив с приближением 117310.979016494
значения.
array_var38mc = np.isclose(train3.select("var38").rdd.flatMap(lambda x: x).collect(), 117310.979016494)
Результатом является объект numpy.ndarray
, подобный этому [True, False, True]
Далее я пытаюсь добавить Numpy
массив, ранее вычисленный с использованием этих же данных PySpark.Dataframe
.
train4 = train3.withColumn('var38mc',col(df_var38mc))
Но я получил эту ошибку:
AttributeError: 'DataFrame' object has no attribute '_get_object_id'
PS: Я безуспешно пытался преобразовать массив numpy в список и в другой фрейм данных PySpark.
Ответ №1:
Вместо этого используйте UDF:
import pyspark.sql.functions as F
from pyspark.sql.types import BooleanType
import numpy as np
func = F.udf(lambda x: bool(np.isclose(x, 117310.979016494)), BooleanType())
train4 = train3.withColumn('var38mc', func('var38'))