Spark SQL 如何读取 Parquet 分区文件

sco*_*pio 4 partitioning apache-spark parquet apache-spark-sql

我有一个大约 1 GB 的镶木地板文件。每个数据记录都是来自 IOT 设备的读数,它捕获设备在过去一分钟内消耗的能量。架构:houseId、deviceId、energy 镶木地板文件根据houseId 和deviceId 进行分区。一个文件只包含过去 24 小时的数据。

我想使用 Spark SQL 对驻留在此镶木地板文件中的数据执行一些查询示例查询找出给定房屋在过去 24 小时内每台设备消耗的平均能源。

Dataset<Row> df4 = ss.read().parquet("/readings.parquet");
df4.as(encoder).registerTempTable("deviceReadings");
ss.sql("Select avg(energy) from deviceReadings where houseId=3123).show();
Run Code Online (Sandbox Code Playgroud)

上面的代码运行良好。我想了解 spark 如何执行此查询。

  1. Spark 是否在不查看查询的情况下从 HDFS 读取内存中的整个 Parquet 文件?(我不相信这是真的)
  2. Spark 是否仅根据查询从 HDFS 加载所需的分区?
  3. 如果有多个查询需要执行怎么办?Spark 在准备执行计划时会查看多个查询吗?一个查询可能只处理一个分区,而第二个查询可能需要所有分区,因此合并计划应将整个文件从磁盘加载到内存中(如果内存限制允许)。
  4. 如果我在上面缓存 df4 数据帧,执行时间会有所不同吗?

hi-*_*zir 5

Spark 是否在不查看查询的情况下从 HDFS 读取内存中的整个 Parquet 文件?

它不应该扫描所有数据文件,但通常可以访问所有文件的元数据。

Spark 是否仅根据查询从 HDFS 加载所需的分区?

是的,它确实。

Spark 是否仅根据查询从 HDFS 加载所需的分区?

它不是。每个查询都有自己的执行计划。

如果我在上面缓存 df4 数据帧,执行时间会有所不同吗?

是的,至少现在,它会有所作为 -在保留分区的同时缓存数据帧