PySpark 2.2 UDF(用户定义函数)在交互式外壳中无法正常工作

时间:2019-06-20 04:34:26

标签: shell apache-spark pyspark user-defined-functions pyspark-sql

PySpark 2.2 UDF(用户定义的函数)在交互式外壳中不起作用

我在pyspark 2.2中使用训练有素的随机森林分类器进行了预测,我有一个带有客户ID的数据框和一个概率列,该列是两个值的向量,概率为0和1。我进行了许多搜索,从向量中提取概率值的唯一方法是使用用户定义的函数(UDF)。我的最终目标是在概率列中提取向量的第二个元素。我是通过交互式外壳来实现的。

我使用下面链接中提供的答案来创建udf,并从概率列中的向量中获取值。

Access element of a vector in a Spark DataFrame (Logistic Regression probability vector)

pred_df是带有客户ID的数据框和带有矢量的概率列。

pred_df = rfpredictions_all.select('cust_id','probability')
pred_df.show(10, False)

|cust_id         |probability                               |
+----------------+------------------------------------------+
|-499988999999354|[0.344300440937649,0.655699559062351]     |
|-499984999999844|[0.9999861414235123,1.3858576487785479E-5]|
|-499982999999468|[0.9999863031877703,1.36968122295972E-5]  |
|-499963999999604|[0.9673885836112887,0.03261141638871133]  |
|-499961999999624|[0.9995773601067997,4.226398932004604E-4] |
|-499955999999657|[0.3948082168680653,0.6051917831319348]   |
|-499941999999545|[0.22254333914997668,0.7774566608500233]  |
|-499940999999366|[0.28004123106727474,0.7199587689327253]  |
|-499921999999925|[0.2842185949678544,0.7157814050321456]   |
|-499915999999580|[0.2524942837199675,0.7475057162800324]   |

在这里我捕获了概率列中向量的第二个元素

prob_1=udf(lambda v:float(v[1]),FloatType())
prob_df = pred_df.select('cust_id',prob_1('probability').alias('prob_sigch'))
prob_df.show(10)

运行prob_df.show(10)

时发生错误

错误如下:

Py4JJavaError:调用o311.showString时发生错误。 :org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段48.0中的任务0失败了4次,最近一次失败:阶段48.0中的任务0.3丢失(TID 1966,anp-r06wn02.c03.hadoop.td.com ,执行者3):java.io.IOException:无法运行程序“ / usr / local / anaconda3 / bin / ipython”:error = 2,没有这样的文件或目录

以下链接大致说明了在Spark运行之前创建UDF实例的过程,但是这对我来说没有意义,因为我的sparksession在整个程序中都运行。

Functions from custom module not working in PySpark, but they work when inputted in interactive mode

我想补充的另一件事是,相同的代码在Jupyter Notebook中可以正常工作,但是在交互式Shell中或当我尝试在jupyter之外运行作业时出现上述错误。

预先感谢您的帮助!

0 个答案:

没有答案