在 pyspark 中找不到 col 函数
Cannot find col function in pyspark
在 pyspark 1.6.2 中,我可以通过
导入 col
函数
from pyspark.sql.functions import col
但是当我尝试在 Github source code 中查找时,我发现 functions.py
文件中没有 col
函数,python 如何导入一个不存在的函数'不存在?
它存在。它只是没有明确定义。从 pyspark.sql.functions
导出的函数是 JVM 代码的精简包装器,除了少数需要特殊处理的例外情况外,都是使用辅助方法自动生成的。
如果你仔细检查来源 you'll find col
listed among other _functions
. This dictionary is further iterated and _create_function
是用来生成包装器的。每个生成的函数直接赋值给globals
.
中对应的名字
最后 __all__
,它定义了从模块导出的项目列表,只导出所有 globals
不包含在黑名单中的项目。
如果这个机制仍然不清楚你可以创建一个玩具示例:
使用以下内容创建名为 foo.py
的 Python 模块:
# Creates a function assigned to the name foo
globals()["foo"] = lambda x: "foo {0}".format(x)
# Exports all entries from globals which start with foo
__all__ = [x for x in globals() if x.startswith("foo")]
将它放在 Python 路径的某处(例如在工作目录中)。
导入foo
:
from foo import foo
foo(1)
这种元编程方法的一个不良副作用是定义的函数可能无法被纯粹依赖于静态代码分析的工具识别。这不是一个关键问题,在开发过程中可以安全地忽略。
取决于 IDE 安装 type annotations might resolve the problem (see for example zero323/pyspark-stubs#172).
我 运行 在尝试使用 Eclipse 和 PyDev 设置 PySpark 开发环境时遇到了类似的问题。 PySpark 使用动态命名空间。为了让它工作,我需要将 PySpark 添加到 "force Builtins",如下所示。
从 VS Code 1.26.1 开始,这可以通过修改 python.linting.pylintArgs
设置来解决:
"python.linting.pylintArgs": [
"--generated-members=pyspark.*",
"--extension-pkg-whitelist=pyspark",
"--ignored-modules=pyspark.sql.functions"
]
github 上解释了该问题:https://github.com/DonJayamanne/pythonVSCode/issues/1418#issuecomment-411506443
在 Pycharm 中,col
函数和其他函数被标记为 "not found"
解决方法是导入 functions
并从那里调用 col
函数。
例如:
from pyspark.sql import functions as F
df.select(F.col("my_column"))
如上所述,pyspark 会动态生成它的一些函数,这使得大多数 IDE 无法正确检测到它们。但是,有一个 python 包 pyspark-stubs,其中包含一组存根文件,以便改进类型提示、静态错误检测、代码完成……
通过
安装
pip install pyspark-stubs==x.x.x
(其中 x.x.x 必须替换为您的 pyspark 版本(例如 2.3.0。在我的例子中)),col
和其他功能将被检测到,而无需更改您的任何内容大多数 IDE 的代码(Pycharm、Visual Studio Code、Atom、Jupyter Notebook,...)
正如@zero323 所指出的,有几个 spark 函数具有在运行时生成的包装器,方法是添加到全局字典,然后将它们添加到 __all__
。正如 @vincent-claes 所指出的那样,使用 function
路径引用函数(如 F
或其他,我更喜欢更具描述性的东西)可以使导入不显示PyCharm 中的错误。但是,正如@nexaspx 在对该答案的评论中提到的那样,这会将警告转移到用法行。如@thomas 所述,可以安装 pyspark-stubs 来改善这种情况。
但是,如果出于某种原因无法添加该软件包(也许您正在为您的环境使用 docker 图像,但现在无法将其添加到图像中),或者它不是'不工作,这是我的解决方法:首先,为生成的包装器添加一个带有别名的导入,然后禁用对该导入的检查。这允许所有用法仍然对同一语句中的其他函数进行检查,将警告点减少到一个,然后忽略那个警告。
from pyspark.sql import functions as pyspark_functions
# noinspection PyUnresolvedReferences
from pyspark.sql.functions import col as pyspark_col
# ...
pyspark_functions.round(...)
pyspark_col(...)
如果您有多个进口商品,请将它们分组,这样就只有一个 noinspection
:
# noinspection PyUnresolvedReferences
from pyspark.sql.functions import (
col as pyspark_col, count as pyspark_count, expr as pyspark_expr,
floor as pyspark_floor, log1p as pyspark_log1p, upper as pyspark_upper,
)
(这是我使用 Reformat File
命令时 PyCharm 格式化它的方式)。
虽然我们讨论的是如何导入 pyspark.sql.functions
,但我建议不要从 pyspark.sql.functions
导入单个函数,以避免隐藏 Python 内置函数,这会导致模糊错误, 作为@SARose states.
直接导入所有pyspark函数;
from pyspark.sql.functions import *
...
col('my_column')
您可能还想使用别名来解决函数阴影问题;
from pyspark.sql import functions as f
...
f.col('my_column')
在 pyspark 1.6.2 中,我可以通过
导入col
函数
from pyspark.sql.functions import col
但是当我尝试在 Github source code 中查找时,我发现 functions.py
文件中没有 col
函数,python 如何导入一个不存在的函数'不存在?
它存在。它只是没有明确定义。从 pyspark.sql.functions
导出的函数是 JVM 代码的精简包装器,除了少数需要特殊处理的例外情况外,都是使用辅助方法自动生成的。
如果你仔细检查来源 you'll find col
listed among other _functions
. This dictionary is further iterated and _create_function
是用来生成包装器的。每个生成的函数直接赋值给globals
.
最后 __all__
,它定义了从模块导出的项目列表,只导出所有 globals
不包含在黑名单中的项目。
如果这个机制仍然不清楚你可以创建一个玩具示例:
使用以下内容创建名为
foo.py
的 Python 模块:# Creates a function assigned to the name foo globals()["foo"] = lambda x: "foo {0}".format(x) # Exports all entries from globals which start with foo __all__ = [x for x in globals() if x.startswith("foo")]
将它放在 Python 路径的某处(例如在工作目录中)。
导入
foo
:from foo import foo foo(1)
这种元编程方法的一个不良副作用是定义的函数可能无法被纯粹依赖于静态代码分析的工具识别。这不是一个关键问题,在开发过程中可以安全地忽略。
取决于 IDE 安装 type annotations might resolve the problem (see for example zero323/pyspark-stubs#172).
我 运行 在尝试使用 Eclipse 和 PyDev 设置 PySpark 开发环境时遇到了类似的问题。 PySpark 使用动态命名空间。为了让它工作,我需要将 PySpark 添加到 "force Builtins",如下所示。
从 VS Code 1.26.1 开始,这可以通过修改 python.linting.pylintArgs
设置来解决:
"python.linting.pylintArgs": [
"--generated-members=pyspark.*",
"--extension-pkg-whitelist=pyspark",
"--ignored-modules=pyspark.sql.functions"
]
github 上解释了该问题:https://github.com/DonJayamanne/pythonVSCode/issues/1418#issuecomment-411506443
在 Pycharm 中,col
函数和其他函数被标记为 "not found"
解决方法是导入 functions
并从那里调用 col
函数。
例如:
from pyspark.sql import functions as F
df.select(F.col("my_column"))
如上所述,pyspark 会动态生成它的一些函数,这使得大多数 IDE 无法正确检测到它们。但是,有一个 python 包 pyspark-stubs,其中包含一组存根文件,以便改进类型提示、静态错误检测、代码完成…… 通过
安装pip install pyspark-stubs==x.x.x
(其中 x.x.x 必须替换为您的 pyspark 版本(例如 2.3.0。在我的例子中)),col
和其他功能将被检测到,而无需更改您的任何内容大多数 IDE 的代码(Pycharm、Visual Studio Code、Atom、Jupyter Notebook,...)
正如@zero323 所指出的,有几个 spark 函数具有在运行时生成的包装器,方法是添加到全局字典,然后将它们添加到 __all__
。正如 @vincent-claes 所指出的那样,使用 function
路径引用函数(如 F
或其他,我更喜欢更具描述性的东西)可以使导入不显示PyCharm 中的错误。但是,正如@nexaspx 在对该答案的评论中提到的那样,这会将警告转移到用法行。如@thomas 所述,可以安装 pyspark-stubs 来改善这种情况。
但是,如果出于某种原因无法添加该软件包(也许您正在为您的环境使用 docker 图像,但现在无法将其添加到图像中),或者它不是'不工作,这是我的解决方法:首先,为生成的包装器添加一个带有别名的导入,然后禁用对该导入的检查。这允许所有用法仍然对同一语句中的其他函数进行检查,将警告点减少到一个,然后忽略那个警告。
from pyspark.sql import functions as pyspark_functions
# noinspection PyUnresolvedReferences
from pyspark.sql.functions import col as pyspark_col
# ...
pyspark_functions.round(...)
pyspark_col(...)
如果您有多个进口商品,请将它们分组,这样就只有一个 noinspection
:
# noinspection PyUnresolvedReferences
from pyspark.sql.functions import (
col as pyspark_col, count as pyspark_count, expr as pyspark_expr,
floor as pyspark_floor, log1p as pyspark_log1p, upper as pyspark_upper,
)
(这是我使用 Reformat File
命令时 PyCharm 格式化它的方式)。
虽然我们讨论的是如何导入 pyspark.sql.functions
,但我建议不要从 pyspark.sql.functions
导入单个函数,以避免隐藏 Python 内置函数,这会导致模糊错误, 作为@SARose states.
直接导入所有pyspark函数;
from pyspark.sql.functions import *
...
col('my_column')
您可能还想使用别名来解决函数阴影问题;
from pyspark.sql import functions as f
...
f.col('my_column')