在pyspark 1.6.2中,我可以导入col
函数由
from pyspark.sql.functions import col
但当我尝试在GitHub 源代码 https://github.com/apache/spark/blob/branch-1.6/python/pyspark/sql/functions.py我发现没有col
函数于functions.py
文件,python如何导入一个不存在的函数?
它存在。只是没有明确定义。函数导出自pyspark.sql.functions
是 JVM 代码的薄包装器,除了少数需要特殊处理的例外情况外,都是使用辅助方法自动生成的。
如果你仔细检查来源你会找到col除其他外列出的_functions https://github.com/apache/spark/blob/v1.6.2/python/pyspark/sql/functions.py#L72。这本词典是进一步迭代 https://github.com/apache/spark/blob/v1.6.2/python/pyspark/sql/functions.py#L185-L186 and _create_function https://github.com/apache/spark/blob/v1.6.2/python/pyspark/sql/functions.py#L35-L43用于生成包装器。每个生成的函数都直接分配给对应的名称globals
.
Finally __all__
,它定义了从模块导出的项目列表,只需导出所有globals
排除黑名单中的内容。
如果这种机制仍然不清楚,您可以创建一个玩具示例:
-
创建名为的 Python 模块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 路径上的某个位置(例如工作目录中)。
-
Import foo
:
from foo import foo
foo(1)
这种元编程方法的一个不受欢迎的副作用是定义的函数可能无法被纯粹依赖于静态代码分析的工具识别。这不是一个关键问题,在开发过程中可以安全地忽略。
取决于IDE安装类型注释 https://pypi.org/project/pyspark-stubs/可能会解决问题(例如参见Zero323/pyspark-stubs#172 https://github.com/zero323/pyspark-stubs/issues/172).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)