Python 在pyspark中找不到col函数
在pyspark 1.6.2中,我可以通过Python 在pyspark中找不到col函数,python,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,在pyspark 1.6.2中,我可以通过 from pyspark.sql.functions import col 但是当我试图在functions.py文件中查找它时,我发现没有col函数,python如何导入一个不存在的函数呢。它只是没有明确定义。从pyspark.sql.Functions导出的函数是围绕JVM代码的薄型包装,除了少数需要特殊处理的异常情况外,都是使用helper方法自动生成的 如果你仔细检查来源。此词典用于生成包装器。每个生成的函数直接分配给全局文件中的相应名称 最
from pyspark.sql.functions import col
但是当我试图在
functions.py
文件中查找它时,我发现没有col
函数,python如何导入一个不存在的函数呢。它只是没有明确定义。从pyspark.sql.Functions
导出的函数是围绕JVM代码的薄型包装,除了少数需要特殊处理的异常情况外,都是使用helper方法自动生成的
如果你仔细检查来源。此词典用于生成包装器。每个生成的函数直接分配给全局文件中的相应名称
最后,定义从模块导出的项目列表的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,只导出除黑名单中包含的项目之外的所有全局项目
如果此机制仍然不清楚,您可以创建一个玩具示例:
- 使用以下内容创建名为
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的不同,安装可能会解决问题(请参见示例)。我在尝试使用Eclipse和PyDev设置PySpark开发环境时遇到了类似的问题。PySpark使用动态名称空间。为了让它工作,我需要将PySpark添加到“force Builtins”中,如下所示
从到代码1.26.1这可以通过修改python.linting.pylintArgs
设置来解决:
"python.linting.pylintArgs": [
"--generated-members=pyspark.*",
"--extension-pkg-whitelist=pyspark",
"--ignored-modules=pyspark.sql.functions"
]
github上解释了这个问题:在Pycharm中,col
函数和其他函数被标记为“未找到”
一种解决方法是导入函数
,然后从那里调用col
函数
例如:
from pyspark.sql import functions as F
df.select(F.col("my_column"))
如上所述,pyspark会动态生成一些函数,这使得大多数IDE无法正确检测它们。但是,有一个python包,其中包含一组存根文件,以便改进类型提示、静态错误检测、代码完成等等。。。
只需安装
pip install pyspark-stubs==x.x.x
(在x.x.x必须被pyspark版本(例如,在我的例子中是2.3.0)替换的情况下,col
和其他函数将被检测到,而不会对大多数IDE(Pycharm、Visual Studio代码、Atom、Jupyter笔记本等)的代码进行任何更改)正如@zero323所指出的那样,有几个spark函数在运行时通过添加到globals dict,然后将它们添加到\uuuuu all\uuuu
生成包装器。正如@vincent claes所指出的,使用函数
路径引用函数(如F
或其他,我更喜欢更具描述性的方式)可以使导入不会在PyCharm中显示错误。然而,正如@nexaspx在对该答案的评论中所暗示的那样,这将警告转移到了用法行。正如@thomas pyspark所提到的,可以安装存根来改善这种情况
但是,如果出于某种原因,添加该包不是一个选项(可能您正在为您的环境使用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,
)
(当我使用重新格式化文件时,PyCharm就是这样格式化的)
当我们讨论如何导入pyspark.sql.functions
时,我建议不要从pyspark.sql.functions
导入单个函数,以避免隐藏Python内置函数,这可能会导致模糊错误,如eclipse中的@SARose.如果仍然看到错误标记,右键单击project->pydev->代码分析。这应该会去掉标记。对于我来说,这仍然会给出在'functions.py'中找不到引用'col'。
警告…@nexaspark您的pyspark版本与您的spark版本相同吗?您是否设置了SPARK_HOME环境变量?在Pylint中,这似乎没有帮助。但是在Flake8中,哪一个更好,它确实如此。对于pyspark 2.4.5,我必须使用pyspark存根2.4.0```$pip freeze | grep pyspark pyspark==2.4.4 pyspark存根==2.4.0``我安装了2.4.0,但它仍然不起作用。链接不再存在,这就是我需要的!我将该选项添加到我的setup.cfg
中,作为ignored modules=pyspark.sql.functions