【问题标题】:How Spark SQL reads Parquet partitioned filesSpark SQL 如何读取 Parquet 分区文件
【发布时间】: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 是如何执行这个查询的。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    是的,确实如此。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2017-12-02
      • 2020-10-28
      • 1970-01-01
      • 2015-11-27
      • 2015-12-19
      • 2018-08-09
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多