为什么赢了';t我的应用程序以pandas_udf和PySpark+;瓶子

为什么赢了';t我的应用程序以pandas_udf和PySpark+;瓶子,pandas,flask,pyspark,Pandas,Flask,Pyspark,当我的Flask+PySpark应用程序具有带有@udf或@pandas\u udf注释的函数时,它将不会启动。如果我只是删除注释,它就会启动。 如果我尝试使用Flask启动应用程序,则会执行脚本的第一次词法解释。例如,调试器在导入行停止,例如 从pyspark.sql.functions导入pandas\u udf、udf、PandasUDFType . 但是,根本不执行任何语句,包括初始的app=Flask(name)语句。(这可能是某种隐藏的例外吗?) 如果我在启动应用程序时没有使用Fla

当我的Flask+PySpark应用程序具有带有@udf或@pandas\u udf注释的函数时,它将不会启动。如果我只是删除注释,它就会启动。 如果我尝试使用Flask启动应用程序,则会执行脚本的第一次词法解释。例如,调试器在导入行停止,例如 从pyspark.sql.functions导入pandas\u udf、udf、PandasUDFType . 但是,根本不执行任何语句,包括初始的app=Flask(name)语句。(这可能是某种隐藏的例外吗?) 如果我在启动应用程序时没有使用Flask,使用相同的确切功能和相同的导入,它确实可以工作

这些是进口产品:

from pyspark.sql import SQLContext
from pyspark.sql import SparkSession
from pyspark.sql.functions import pandas_udf, udf, PandasUDFType
import pandas as pd
这就是功能:

@pandas_udf('string', PandasUDFType.SCALAR)
def pandas_not_null(s):
    return s.fillna("_NO_NA_").replace('', '_NO_E_')
这是在@pandas_udf存在时未执行的语句:

app = Flask(__name__)
IntelliJ就是这样启动的:

FLASK_APP = app
FLASK_ENV = development
FLASK_DEBUG = 1
In folder /Users/vivaomengao/projects/dive-platform/cat-intel/divecatintel

/Users/vivaomengao/anaconda/bin/python /Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py --module --multiproc --qt-support=auto --client 127.0.0.1 --port 56486 --file flask run

我在自己的计算机上运行MacOS。

我发现了问题。问题在于@pandas_udf注释在加载模块时需要一个Spark会话(Python中的某种“第一次传递解析”)。为了解决这个问题,我首先调用了创建Spark会话的代码。然后我导入了具有@pandas\u udf注释的函数的模块。我把它直接导入了调用者函数中,而不是在标题处。
为了排除故障,我在@pandas_udf函数(在PyCharm中)上设置了一个断点,然后进入函数。这样我就可以检查局部变量了。其中一个变量引用了类似“sc”或“jvm”的内容。我从过去的一个问题中知道,如果Spark会话未初始化,就会发生这种情况。

这非常有用。我也面临同样的问题,并在调用pandas_udf函数之前导入模块解决了这个问题,因为我有可用的spark会话。