# 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")]
正如@zero323所指出的,有几个spark函数在运行时通过添加到globals dict,然后添加到globals dict生成 Package 器 __all__ . 正如@vincent claes使用 function 路径(as) F 或者作为其他东西,我更喜欢一些更具描述性的东西)可以使它这样导入不会显示pycharm中的错误。然而,正如@nexaspx在对该答案的评论中提到的,这将警告转移到用法行。正如@thomas pyspark提到的,可以安装stubs来改善这种情况。 但是,如果出于某种原因,添加该包不是一个选项(可能您正在为您的环境使用docker映像,现在无法将其添加到映像),或者它不起作用,那么我的解决方法是:首先,仅为生成的带有别名的 Package 添加导入,然后仅为该导入禁用检查。这允许所有用法仍然对同一语句中的其他函数进行检查,将警告点减少到只有一个,然后忽略这一个警告。
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,
)
6条答案
按热度按时间uajslkp61#
在pycharm
col
函数和其他函数标记为“未找到”解决方法是导入
functions
打电话给col
从那里开始运作。例如:
disho6za2#
它是存在的。只是没有明确定义。从导出的函数
pyspark.sql.functions
是jvm代码的精简 Package 器,除了少数需要特殊处理的异常情况外,它们是使用helper方法自动生成的。如果你仔细查清来源,你会找到的
col
列在其他_functions
. 这本词典被进一步迭代和修改_create_function
用于生成 Package 器。每个生成的函数直接分配给globals
.最后
__all__
,它定义从模块导出的项的列表,只导出所有项globals
不包括黑名单上的。如果这个机制还不清楚,你可以创建一个玩具的例子:
创建名为
foo.py
内容如下:将它放在python路径的某个地方(例如在工作目录中)。
导入
foo
:这种元编程方法的一个不希望出现的副作用是,纯粹依赖于静态代码分析的工具可能无法识别已定义的函数。这不是一个关键问题,在开发过程中可以安全地忽略。
根据ide的不同,安装类型注解可能会解决这个问题(例如,请参见zero323/pyspark stubs#172)。
jjjwad0x3#
从vs代码1.26.1开始,可以通过修改
python.linting.pylintArgs
设置:github上解释了这个问题:https://github.com/donjayamanne/pythonvscode/issues/1418#issuecomment-411506443
bvhaajcl4#
我在尝试用eclipse和pydev建立pyspark开发环境时遇到了类似的问题。pyspark使用动态名称空间。为了让它工作,我需要添加pyspark到“force builtins”中,如下所示。
9fkzdhlc5#
如上所述,pyspark动态生成一些函数,这使得大多数ide无法正确地检测到它们。但是,有一个python包pyspark stubs,它包含一组存根文件,这样类型提示就得到了改进,静态错误检测,代码完成。。。只需安装
(其中x.x.x必须替换为pyspark版本(2.3.0)。以我为例,
col
其他函数将被检测到,而不会更改大多数ide的代码(pycharm、visualstudio代码、atom、jupyter笔记本等)lf5gs5x26#
正如@zero323所指出的,有几个spark函数在运行时通过添加到globals dict,然后添加到globals dict生成 Package 器
__all__
. 正如@vincent claes使用function
路径(as)F
或者作为其他东西,我更喜欢一些更具描述性的东西)可以使它这样导入不会显示pycharm中的错误。然而,正如@nexaspx在对该答案的评论中提到的,这将警告转移到用法行。正如@thomas pyspark提到的,可以安装stubs来改善这种情况。但是,如果出于某种原因,添加该包不是一个选项(可能您正在为您的环境使用docker映像,现在无法将其添加到映像),或者它不起作用,那么我的解决方法是:首先,仅为生成的带有别名的 Package 添加导入,然后仅为该导入禁用检查。这允许所有用法仍然对同一语句中的其他函数进行检查,将警告点减少到只有一个,然后忽略这一个警告。
如果您有几个导入,那么将它们分组,以便只有一个导入
noinspection
:(这是我使用
Reformat File
命令)。在我们讨论如何进口的时候
pyspark.sql.functions
,我建议不要从导入单个函数pyspark.sql.functions
避免隐藏python内置代码,这可能会导致模糊的错误,如@sarose所述。