Ошибка функции pyspark udf в лямбда-функции - PullRequest
0 голосов
/ 24 ноября 2018

Я написал функцию udf ниже, и она выдает мне ошибку.Пожалуйста, помогите.

Ниже приведен мой набор данных;

df1 = sqlContext.range(0, 1000)\
 .withColumn('normal1',func.abs(10*func.round(randn(seed=1),2)))\
 .withColumn('normal2',func.abs(100*func.round(randn(seed=2),2)))\
 .withColumn('normal3',func.abs(func.round(randn(seed=3),2)))

df1 = df1.withColumn('Y',when(df1.normal1*df1.normal2*df1.normal3>750, 1)\
       .otherwise(0))

Функция udf ниже:

from pyspark.sql import types as T
balancingRatio=0.8
calculateWeights = udf(lambda d:(1 * balancingRatio) if d==0 else (1 * (1.0 -   balancingRatio)),T.IntegerType())
weightedDataset = df1.withColumn('classWeightCol', calculateWeights('Y'))
weightedDataset.show() 

Требуется некоторое время и выдается ошибка;

Py4JJavaError: An error occurred while calling o670.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 
in stage 25.0 failed 1 times, most recent failure: Lost task 0.0 in stage 
25.0 (TID 427, localhost, executor driver): org.apache.spark.SparkException: 
Python worker failed to connect back.

В чем может быть проблема?Спасибо.

Простой пример в интернете, который я обнаружил, также не работает

maturity_udf = udf(lambda age: "adult" if age >=18 else "child", 
 T.StringType())
df = sqlContext.createDataFrame([{'name': 'Alice', 'age': 1}])
df.withColumn("maturity", maturity_udf(df.age)).show()

Нет: у меня есть Python 3.7.1 и spark 2.4

1 Ответ

0 голосов
/ 11 января 2019

Вам нужно отключить безопасность вилки, установив для переменной OBJC_DISABLE_INITIALIZE_FORK_SAFETY значение YES Это решило проблему для меня.

import os
os.environ['OBJC_DISABLE_INITIALIZE_FORK_SAFETY'] = 'YES'
...