Spark SQL如何读取分区Parquet文件

4
我有一个大小约为1GB的Parquet文件。每个数据记录是来自IoT设备的读数,捕获设备在过去一分钟内消耗的能量。 架构:houseId、deviceId、energy Parquet文件被分区为houseId和deviceId。一个文件仅包含最近24小时的数据。
我希望使用Spark SQL对存储在此Parquet文件中的数据执行一些查询。一个例子查询找出了在最近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();

以上代码可以正常运行。我想了解一下spark是如何执行这个查询的。

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

6
Spark是否在未查询的情况下从HDFS中将整个Parquet文件读入内存?
应该不会扫描所有数据文件,但通常可能访问所有文件的元数据。
Spark是否根据查询仅加载所需的分区?
是的,它会。
Spark是否根据查询仅加载所需的分区?
不会。每个查询都有自己的执行计划。
如果我缓存上面的df4数据帧,执行时间是否会有所差异?
是的,至少目前是这样的 - 在保持分区的情况下缓存数据帧

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接