[英]Azure databricks PySpark custom UDF ModuleNotFoundError: No module named
我正在检查这个 SO 但没有任何解决方案帮助PySpark 自定义 UDF ModuleNotFoundError:没有命名的模块
我在 azure 数据块上有当前的回购协议:
|-run_pipeline.py
|-__init__.py
|-data_science
|--__init.py__
|--text_cleaning
|---text_cleaning.py
|---__init.py__
在run_pipeline
笔记本上我有这个
from data_science.text_cleaning import text_cleaning
path = os.path.join(os.path.dirname(__file__), os.pardir)
sys.path.append(path)
spark = SparkSession.builder.master(
"local[*]").appName('workflow').getOrCreate()
df = text_cleaning.basic_clean(spark_df)
在text_cleaning.py
上,我有一个名为 basic_clean 的 function,它将运行如下内容:
def basic_clean(df):
print('Removing links')
udf_remove_links = udf(_remove_links, StringType())
df = df.withColumn("cleaned_message", udf_remove_links("cleaned_message"))
return df
当我在run_pipeline
笔记本上执行df.show()
时,我收到以下错误消息:
Exception has occurred: PythonException (note: full exception trace is shown but execution is paused at: <module>)
An exception was thrown from a UDF: 'pyspark.serializers.SerializationError: Caused by Traceback (most recent call last):
File "/databricks/spark/python/pyspark/serializers.py", line 165, in _read_with_length
return self.loads(obj)
File "/databricks/spark/python/pyspark/serializers.py", line 466, in loads
return pickle.loads(obj, encoding=encoding)
ModuleNotFoundError: No module named 'data_science''. Full traceback below:
Traceback (most recent call last):
File "/databricks/spark/python/pyspark/serializers.py", line 165, in _read_with_length
return self.loads(obj)
File "/databricks/spark/python/pyspark/serializers.py", line 466, in loads
return pickle.loads(obj, encoding=encoding)
ModuleNotFoundError: No module named 'data_science'
进口不应该工作吗? 为什么这是一个问题?
集群上似乎缺少
data-science
模块。 请考虑将其安装在集群上。 请检查以下有关将库安装到集群的链接。 https://learn.microsoft.com/en-us/azure/databricks/libraries/cluster-libraries
您可以考虑执行pip list
命令来查看集群上安装的库。
我在 Azure Devops 中使用 UDF 运行 pyspark 测试时遇到了同样的问题。 我注意到在使用vmImage:ubuntu-latest
从池中运行时会发生这种情况。 当我使用来自以下 Dockerfile 的自定义容器构建时,测试运行良好:
FROM python:3.8.3-slim-buster AS py3
FROM openjdk:8-slim-buster
ENV PYSPARK_VER=3.3.0
ENV DELTASPARK_VER=2.1.0
COPY --from=py3 / /
WORKDIR /setup
COPY requirements.txt .
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt && \
rm requirements.txt
WORKDIR /code
requirements.txt 包含pyspark==3.3.0
和delta-spark==2.1.0
。
这让我得出结论,这是由于 spark 在默认 ubuntu VM 中运行的方式,该 VM 运行 python 3.10.6 和 java 11(在发布时)。 我尝试设置 env 变量,例如PYSPARK_PYTHON
以强制 pyspark 使用相同的 python 二进制文件,在该二进制文件上安装了待测试的 package,但无济于事。
也许您可以使用此信息找到一种方法来使用默认代理池的 ubuntu 虚拟机来使其正常工作,否则我建议像我一样使用预配置的容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.