使用spark对Parquet文件执行hadoop计数操作

x6yk4ghg  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(252)

我有两组相同的数据在Parquet格式的hdfs。
一套按顺序排列 col1 另一组未排序。排序的\u表约为127gb,未排序的\u表约为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上的这些查询,发现对排序的\u表的查询只读取127MB的数据,而对未排序的\u表的查询读取35GB的数据来计算计数。
所以我的问题是:
spark如何通过读取较少的数据来计算计数?
为什么排序的表上的作业读取的数据比未排序的表上的作业少?

xdnvmnnf

xdnvmnnf1#

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/ 但我不明白 min 以及 max 上市的。。。这可能是特定于具体实施的。

相关问题