我正在使用 Python 和 PySpark。我按照此页面在 Windows 上的 Anaconda 中安装 PySpark 进行操作。我尝试获取有关
DataFrame
类及其 toDF
方法的在线帮助。从这个解释来看,所需的导入(以及后续的帮助命令)是:
from pyspark.sql import DataFrame # User import command
help(DataFrame)
help(DataFrame.toDF)
代码可以工作,但我不明白为什么,即使在广泛阅读了包、模块和初始化之后(例如,here、here和here)。
DataFrame
类定义在包pyspark
、子包sql
、模块文件dataframe.py
中。文件 pyspark/sql/__init__.py
包含初始化
# __init__.py import command
from pyspark.sql.dataframe import DataFrame, DataFrameNaFunctions, DataFrameStatFunctions
我看到这个
__init__.py import command
如何将 DataFrame
类放入当前命名空间中。然而,为了使顶部的 User import command
运行,DataFrame
必须像 pyspark.sql
子包中的模块一样出现。我不明白 __init__.py import command
是如何实现这一点的。
有人可以解释一下,指出我引用的资源之一中的关键段落,和/或向我推荐其他信息吗?
我相信答案已给出 这里: “当导入常规包时,这 __init__.py 文件被隐式执行,并且 它定义的对象绑定到中的名称 包的命名空间”。所以如果
pyspark/sq/__init__.py
包含:
from pyspark.sql.dataframe import DataFrame, etc.
那么
DataFrame
是存在于
pyspark.sql
命名空间。因此它变得完美
感觉从那里导入它通过
from pyspark.sql import DataFrame
假设以上是从 REPL 发出的, 这会将
DataFrame
放入
回复。
与我在问题中所说的相反,
__init__.py
不 将 DataFrame 导入到
“当前”命名空间(REPL 命名空间中
此处的场景)。这是一个错误,我
想到删除问题。然而,其他
新手也可能会误以为
__init__.py
文件(甚至导入的模块
*.py
文件)在“当前”上下文中运行
命名空间,类似于从
外壳。
我的问题还说:
from pyspark.sql import DataFrame
意味着
DataFrame
看起来像一个模块
在 pyspark.sql
子包中。读过一本
更多,我发现这不是真的。这
import
命令不仅导入 modules,而且
还有类,实际上是其中定义的任何对象
模块的 *.py
文件(参见
这里)。