gpt4 book ai didi

dataframe - spark 选择列返回旧数据框的引用

转载 作者:行者123 更新时间:2023-12-05 02:37:05 24 4
gpt4 key购买 nike

我使用以下代码:

random = [("ABC",xx, 1), 
("DEF",yy,1),
("GHI",zz, 0)
]
randomColumns = ["name","id", "male"]
randomDF = spark.createDataFrame(data=random, schema = randomColumns)
test_df = randomDF.select("name", "id")
test_df.filter(f.col("male") == '1').show()

从上面的代码来看,我预计它会导致错误,因为对于 test_df,我没有从原始数据框中选择男性列。令人惊讶的是,上面的查询运行得很好,没有任何错误,并输出以下内容:

+---------+-------+
|name | id|
+---------+-------+
| abc| xx|
| def| yy|
+---------+-------+

我想了解 spark 背后的逻辑。根据 spark 文档 Select 返回一个新的数据框。那为什么它仍然能够使用父数据框中的男性列。

最佳答案

这是Spark生成的DAG造成的。一些运算符(或 transformers)是惰性执行的,因此它们为 Spark 优化 DAG 铺平了道路。

在这个例子中,有两个主要步骤:首先是select(或者SQL术语中的project),然后是filter。但是在其实执行的时候,先filter,再select,因为这样效率更高。

可以通过explain()方法验证这个结论:

test_df.filter(f.col("flag") == '1').explain()

它会输出:

== Physical Plan ==
*(1) Project [dept_name#0, dept_id#1L]
+- *(1) Filter (isnotnull(flag#2L) AND (flag#2L = 1))
+- *(1) Scan ExistingRDD[dept_name#0,dept_id#1L,flag#2L]

关于dataframe - spark 选择列返回旧数据框的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70088322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com