为什么我的应用程序不以pandas_udf和PySpark + Flask开头?

时间:2018-11-14 12:05:50

标签: pandas flask pyspark

当我的Flask + PySpark应用程序具有带有@udf或@pandas_udf批注的功能时,它将无法启动。如果我只是删除注释,它将开始。 如果我尝试使用Flask启动应用程序,则将执行脚本的词汇解释的第一阶段。例如,调试器在诸如 从pyspark.sql.functions导入pandas_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的方式:

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。

1 个答案:

答案 0 :(得分:0)

我发现了问题。问题是@pandas_udf批注在模块加载时需要Spark会话(Python中的某种“首次通过解析”)。为了解决该问题,我首先调用了创建Spark会话的代码。然后,我导入了具有@pandas_udf批注功能的模块。我将其直接导入到调用函数中,而不是导入到标头中。 为了进行故障排除,我在@pandas_udf函数(在PyCharm中)上设置了一个断点,并逐步进入这些函数。这样,我可以检查局部变量。变量之一指的是诸如“ sc”或“ _jvm”之类的东西。从过去的问题中我知道,如果未初始化Spark会话,则会发生这种情况。