【发布时间】:2018-10-04 04:47:43
【问题描述】:
我有一个大约 1 GB 的镶木地板文件。每条数据记录都是来自 IOT 设备的读数,该读数捕获设备在最后一分钟内消耗的能量。 架构:houseId、deviceId、能量 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 是如何执行这个查询的。
- Spark 是否在不查看查询的情况下从 HDFS 读取内存中的整个 Parquet 文件? (我不认为是这种情况)
- Spark 是否仅根据查询从 HDFS 加载所需的分区?
- 如果有多个查询需要执行怎么办? Spark 会在准备执行计划时查看多个查询吗?一个查询可能只使用一个分区,而第二个查询可能需要所有分区,因此统一计划应将整个文件从磁盘加载到内存中(如果内存限制允许的话)。
- 如果我在上面缓存 df4 数据帧,执行时间会有所不同吗?
【问题讨论】:
标签: apache-spark apache-spark-sql partitioning parquet