Добавление массива Numpy в фрейм данных Pyspark

#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'))