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

Posted

技术标签:

【中文标题】为啥我的应用程序不能以 pandas_udf 和 PySpark+Flask 开头?【英文标题】:Why won't my application start with pandas_udf and PySpark+Flask?为什么我的应用程序不能以 pandas_udf 和 PySpark+Flask 开头? 【发布时间】:2018-11-14 12:05:49 【问题描述】:

当我的 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】:

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

【讨论】:

这很有帮助。我也遇到了同样的问题,并通过在调用 pandas_udf 函数之前导入模块解决了这个问题,我有 spark 会话可用。

以上是关于为啥我的应用程序不能以 pandas_udf 和 PySpark+Flask 开头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能让我的 RN 应用程序在本地运行以与本地 api 服务器通信?

使用 pandas_udf 和 Parquet 序列化时内存泄漏?

带有 iloc 的 Pandas_UDF 连接循环

PySpark中pandas_udf的隐式模式?

为啥我不能强制解开我的 $string 以用作 TextField 值?

Spark pandas_udf 并不快