【问题标题】:Count operation on Parquet Files using Spark使用 Spark 对 Parquet 文件进行计数操作
【发布时间】:2017-06-23 11:03:37
【问题描述】:

我在 HDFS 中有两组 Parquet 格式的相同数据。
一组在col1 上排序,另一组未排序。 sorted_table 大约 127 GB,unsorted_table 大约 117 GB。 大小在这里无关紧要。

我使用 Spark SQL 运行了以下两个查询:

select col1, count(*) from sorted_table where col1 = someInt group by col1

select col1, count(*) from unsorted_table where col1 = someInt group by col1

我在 spark UI 上分析了这些查询,我发现 sorted_table 上的查询仅读取 127 MB 的数据,而 unsorted_table 上的查询读取 35 GB 的数据来计算计数。

所以我的问题是:

  1. Spark 如何通过读取更少的数据来计算计数?
  2. 为什么 sorted_table 上的作业与上的作业相比读取的数据更少 unsorted_table?

【问题讨论】:

    标签: hadoop apache-spark parquet


    【解决方案1】:

    Parquet 文件存储在称为行组的块中。每个行组可以为每个字段/列有一些关联的元数据,包括行数、最小值和最大值。由于您的数据已排序,Spark 可以根据这些范围完成对您数据的大块跳过。

    使用parquet_reader,这是我的 Parquet 文件的摘录:

     Column 2
     , values: 35957, null values: 0, distinct values: 0
       max: 17305, min: 17305
       compression: SNAPPY, encodings: RLE PLAIN 
       uncompressed size: 143866, compressed size: 6800
    

    这是一个DATE 字段,所有值都相同,因此最大值和最小值相同。但如果我正在寻找一个特定的日期范围,Spark 可以使用它来决定实际数据是否值得检查。

    这里有关于行组的更多信息:https://parquet.apache.org/documentation/latest/ 但我没有看到 minmax 列出......这可能是特定于实现的。

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2023-04-03
      • 2016-09-07
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多