在 pyspark 中的数据帧上应用 udf 后出错

Posted

技术标签:

【中文标题】在 pyspark 中的数据帧上应用 udf 后出错【英文标题】:error after applying a udf on a dataframe in pyspark 【发布时间】:2019-08-24 00:04:43 【问题描述】:

PYSPARK 版本 2.3.2

我在 pyspark 中有数据框 (df),其架构如下:

>>> df.printSchema
<bound method DataFrame.printSchema of
DataFrame[id: string, 
          F: string, 
          D: string, 
          T: string, 
          S: string, 
          P: string]>

我有以下简化的 UDF:

rep = UserDefinedFunction(lambda x: x.replace(":",";"))

我做的:

df1 = df.withColumn("occ", rep(col("D")))

但是在df1.show()之后有错误:

 df1.show()
 [Stage 9:>                                                       
 (0 + 1) / 1]19/08/23 23:59:15 WARN 
  org.apache.spark.scheduler.TaskSetManager: 
  Lost task 0.0 in stage 9.0 (TID 30, cluster, executor 1):
  java.io.IOException: 
  Cannot run program "/opt/conda/bin/python": 
  error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
  at .....
  Caused by: java.io.IOException: error=2, No such file or directory
  19/08/23 23:59:16 ERROR 
  org.apache.spark.scheduler.TaskSetManager: Task 0 in stage 9.0 failed 4 times; aborting job
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/spark/python/pyspark/sql/dataframe.py", line 350, in show
  print(self._jdf.showString(n, 20, vertical))
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py", line 63, in deco
  return f(*a, **kw)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
  py4j.protocol.Py4JJavaError: An error occurred while calling o339.showString.
  .......

【问题讨论】:

【参考方案1】:

您的安装似乎有问题。

  Cannot run program "/opt/conda/bin/python": 
  error=2, No such file or directory

【讨论】:

【参考方案2】:

问题是安装的 conda 包覆盖了默认的 python,这导致了错误。

【讨论】:

【参考方案3】:

也许问题不在您的代码中。

检查您正在使用的 Java JDK 的版本。我知道.show()方法与Java JDK 11不兼容。如果你使用这个版本,只需降级到版本8。不要忘记正确配置JDK 8的环境变量。

【讨论】:

以上是关于在 pyspark 中的数据帧上应用 udf 后出错的主要内容,如果未能解决你的问题,请参考以下文章

从Pyspark UDF调用另一个自定义Python函数

在 pandas 数据帧上应用 Pyspark 管道

如何在 pyspark 中的数据帧上使用 fuzz.ratio

Pyspark:UDF 将正则表达式应用于数据帧中的每一行

如何在 pyspark 数据帧上应用 group by 并对结果对象进行转换

PySpark 分组并逐行应用 UDF 操作