Spark SQL如何读取Parquet分区文件

时间:2018-04-24 03:22:28

标签: apache-spark apache-spark-sql partitioning parquet

我有一个大约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();

以上代码效果很好。我想了解spark如何执行此查询。

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

是的,确实如此。

  

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

没有。每个查询都有自己的执行计划。

  

如果我将df4数据帧缓存在上面会不会影响执行时间?

是的,至少现在,它会有所作为 - Caching dataframes while keeping partitions