在pyspark中找不到col函数

sigwle7e  于 2021-05-27  发布在  Spark
关注(0)|答案(6)|浏览(1017)

在pyspark 1.6.2中,我可以导入 col 函数依据

from pyspark.sql.functions import col

但是当我试图在github源代码中查找它时,我发现没有 col 中的函数 functions.py 文件,python如何导入一个不存在的函数?

uajslkp6

uajslkp61#

在pycharm col 函数和其他函数标记为“未找到”

解决方法是导入 functions 打电话给 col 从那里开始运作。
例如:

from pyspark.sql import functions as F
df.select(F.col("my_column"))
disho6za

disho6za2#

它是存在的。只是没有明确定义。从导出的函数 pyspark.sql.functions 是jvm代码的精简 Package 器,除了少数需要特殊处理的异常情况外,它们是使用helper方法自动生成的。
如果你仔细查清来源,你会找到的 col 列在其他 _functions . 这本词典被进一步迭代和修改 _create_function 用于生成 Package 器。每个生成的函数直接分配给 globals .
最后 __all__ ,它定义从模块导出的项的列表,只导出所有项 globals 不包括黑名单上的。
如果这个机制还不清楚,你可以创建一个玩具的例子:
创建名为 foo.py 内容如下:


# 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的不同,安装类型注解可能会解决这个问题(例如,请参见zero323/pyspark stubs#172)。

jjjwad0x

jjjwad0x3#

从vs代码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

bvhaajcl

bvhaajcl4#

我在尝试用eclipse和pydev建立pyspark开发环境时遇到了类似的问题。pyspark使用动态名称空间。为了让它工作,我需要添加pyspark到“force builtins”中,如下所示。

9fkzdhlc

9fkzdhlc5#

如上所述,pyspark动态生成一些函数,这使得大多数ide无法正确地检测到它们。但是,有一个python包pyspark stubs,它包含一组存根文件,这样类型提示就得到了改进,静态错误检测,代码完成。。。只需安装

pip install pyspark-stubs==x.x.x

(其中x.x.x必须替换为pyspark版本(2.3.0)。以我为例, col 其他函数将被检测到,而不会更改大多数ide的代码(pycharm、visualstudio代码、atom、jupyter笔记本等)

lf5gs5x2

lf5gs5x26#

正如@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,
)

(这是我使用 Reformat File 命令)。
在我们讨论如何进口的时候 pyspark.sql.functions ,我建议不要从导入单个函数 pyspark.sql.functions 避免隐藏python内置代码,这可能会导致模糊的错误,如@sarose所述。

相关问题