apache-spark - .select() 到底做了什么?

标签 apache-spark pyspark

我在使用 .select() 时遇到了一个令人惊讶的行为:

>>> my_df.show()
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  5|
|  2|  4|  6|
+---+---+---+

>>> a_c = s_df.select(col("a"), col("c")) # removing column b
>>> a_c.show()
+---+---+
|  a|  c|
+---+---+
|  1|  5|
|  2|  6|
+---+---+

>>> a_c.filter(col("b") == 3).show() # I can still filter on "b"!
+---+---+
|  a|  c|
+---+---+
|  1|  5|
+---+---+

这种行为让我想知道......我的以下几点正确吗?

DataFrames 只是 View ,一个简单的 DataFrame 就是一个 View 本身。就我而言 a_c只是查看 my_df .

当我创建 a_c没有创建新数据,a_c只是指向相同的数据 my_df是指。

如果有其他相关信息,请补充!

最佳答案

这是因为 Spark 的惰性。它足够“聪明”,可以将过滤器向下推,使其发生在较低的级别 - 在过滤器之前*。所以,因为这一切都发生在同一个 stage 中执行并且仍然能够解决。事实上,您可以在 explain 中看到这一点。 :

== Physical Plan ==
*Project [a#0, c#2]
+- *Filter (b#1 = 3) <---Filter before Project
   +- LocalTableScan [A#0, B#1, C#2]

但是,您可以强制洗牌和新阶段,然后看到您的过滤器失败。甚至在编译时捕获它。下面是一个例子:
a_c.groupBy("a","c").count.filter(col("b") === 3)

*还有一个投影修剪,如果它意识到它在任何时候都不需要列,则将选择下推到数据库层。但是我相信过滤器会导致它“需要”它而不是修剪......但我没有测试过。

关于apache-spark - .select() 到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934549/

相关文章:

apache-spark - Spark : commit kafka offsets on end of batch

apache-spark - 使用每个分区中的 _SUCCESS 文件将分区数据集写入 HDFS/S3

scala - Spark : Get max consecutive decrease in value

python - Spark : pyspark crash for some datasets - ubuntu

python - Azure Databricks 未在 Spark 上并行化

apache-spark - 如何减少 EMR 中 Apache Spark 的日志?

python - Apache Spark Python 到 Scala 的翻译

java - 如何在spark中读取HDFS序列文件

python - 对 Pyspark 数据帧进行分组和过滤

python - PySpark - 连接到 s3 - 将文件读取到 rdd