apache-spark - Spark SQL 如何读取 Parquet 分区文件

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

我有一个大约 1 GB 的 Parquet 文件。每个数据记录都是来自 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 数据帧,执行时间会有所不同吗?
  • 最佳答案

    Does Spark read the whole Parquet file in memory from HDFS without looking at the query?



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

    Does Spark load only the required partitions from HDFS as per the query?



    是的,它确实。

    Does Spark load only the required partitions from HDFS as per the query?



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

    Will it make a difference in execution time if I cache df4 dataframe above?



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

    关于apache-spark - Spark SQL 如何读取 Parquet 分区文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49992952/

    相关文章:

    apache-spark - PySpark-列中的to_date格式

    python - 使用 Python 类中的方法作为 PySpark 用户定义函数

    apache-spark - Spark Dataframe groupBy 并将结果排序到列表中

    streaming - Spark 流 : enrich stream with reference data

    c++ - 为什么找到 2 个不同大小的排序数组的中位数需要 O(log(min(n,m)))

    java - 寻找将数组拆分为 k 数组的有效方法

    MySQL索引设计与表分区

    apache-spark - svd 性能 pyspark 与 scipy

    python - PySpark - 按时间间隔连接数据帧

    scala - 将多个 map 与 map 值合并为自定义案例类实例