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之外运行作业时出现上述错误。
预先感谢您的帮助!