使用PySpark将python UDF导入Jupyter笔记本时出现问题:在python源代码(/src)中找不到模块

2024-04-18 19:06:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个python UDF,它使用以前定义的python函数而不是lambda(UDF的标准输入)。当代码在jupyter笔记本中执行时,这似乎会导致奇怪的导入错误(例如,调用df.show()或df.collect())

代码的结构很简单(例如,在src/src_code.py中)

   class MyClass(pyspark.ml.Transformer):

       def __init__(self, inputCol, outputCol, extra_arg):
           self.inputCol=inputCol
           self.outputCol=outputCol
           self.extra_arg=extra_arg

       def _transform(self, dataset):
         dataset = dataset.withColumn(self.inputCol, F.udf(lambda x: example_python_fn(x, 
             self.extra_arg))(F.col(self.inputCol)))

   def example_python_fn(self, x, extra_arg):
        return x + extra_arg

我尝试使用函数调用而不是lambda,因为我想将两个变量传递到函数中,这似乎是最干净的方法

我可以将这个类导入jupyter笔记本。但是当我出于某种原因运行代码时 尝试导入函数(可能在其中一个执行器上)。这将导致错误 如下所示:

line 172, in _read_with_length
    return self.loads(obj)
  File "/opt/anaconda/lib/python3.6/site-packages/pyspark/python/lib/pyspark.zip/pyspark/serializers.py", line 580, in loads
    return pickle.loads(obj, encoding=encoding)
ModuleNotFoundError: No module named 'src'

如果我将此代码直接复制到jupyter笔记本中(而不是将其保留在src中),那么代码就可以完美地工作。但我真的不想这么做,因为这太乱了。提前谢谢你的帮助


Tags: lambda函数代码selfsrcreturndefarg