scala - Spark .load() 是否将所有数据放入 DF,然后执行 .select("fields")?
问题描述
我读到 Spark 只检索需要的数据,但我如何使用 Scala 进行检查?我正在使用 Scala 将数据从 ES 索引加载到 Spark DF。并且只需要选择需要的字段,如果我使用这个:
val indexData = sparkSession.read
.format("es")
.option("scroll.limit", 100000)
.load(index)
.select("country")
spark会加载记录的所有字段,然后选择“国家”还是先选择“国家”,然后才加载数据?
解决方案
您可以检查“模式下推”(仅从源加载选择列)在物理查询计划中是否有效。
以这个简单的片段为例,并在您的本地机器上运行它:
import org.apache.spark.sql._
object App {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("test").master("local[*]").getOrCreate()
import spark.implicits._
Seq((1,"aa"),(2,"bb"),(3, "cc")).toDF("id", "value").write.mode("overwrite").parquet("tmp_data")
val df = spark.read.parquet("tmp_data").select("id")
df.explain
}
}
输出应该类似于:
== Physical Plan ==
*(1) ColumnarToRow
+- FileScan parquet [id#13] Batched: true, DataFilters: [], Format: Parquet, Location: InMemoryFileIndex[file:/home/gabriel/IdeaProjects/SparkTests/tmp_data], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<id:int>
根据ReadSchema: struct<id:int>
您可以看到,只有该id
列的数据是从源加载的。
推荐阅读
- delphi - 当我执行 OnDblClick 事件 (Form1) 以打开 Form2 时,它会触发 Form2 的 OnCellClick 事件,而无需单击 form2 网格
- github - 如何在 GitHub markdown 中转义反斜杠
- angular - 具有相对路径的动态图像
- java - 如何在沙发库的全文搜索索引中对 desc/asc 进行排序
- java - 成员内部类变量访问
- java - 无法使用 URI 显示 Google 静态地图编码的折线路径
- javascript - 为什么在 for ... in 中键入一个字符串
- java - 通过继承在java中访问具有父类实例的子类成员
- javascript - Tablesorter:如何按日本天数排序?
- android - 如何使用带有参数的 Kotlin 创建单例?