我有一个大小约为1GB的Parquet文件。每个数据记录是来自IoT设备的读数,捕获设备在过去一分钟内消耗的能量。
架构:houseId、deviceId、energy
Parquet文件被分区为houseId和deviceId。一个文件仅包含最近24小时的数据。
我希望使用Spark SQL对存储在此Parquet文件中的数据执行一些查询。一个例子查询找出了在最近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是如何执行这个查询的。
- Spark在不查看查询的情况下,是否会将整个Parquet文件从HDFS读入内存中?(我不相信这是真的)
- Spark是否根据查询只加载所需的分区?
- 如果有多个需要执行的查询怎么办?Spark在准备执行计划时是否会查看多个查询?一个查询可能只使用一个分区,而第二个查询可能需要所有分区,因此一个综合计划将从磁盘加载整个文件到内存中(如果内存限制允许)。
- 如果我缓存上面的df4 dataframe,执行时间会有所不同吗?