使用Spark计算Parquet文件的操作

时间:2017-06-23 11:03:37

标签: hadoop apache-spark parquet

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

我使用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?

1 个答案:

答案 0 :(得分:2)

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 ......可能是特定于实施的。