我有一个存储在Parquet中的Hive表(未压缩,用于测试目的) . 该表基本上是使用以下查询创建的:

CREATE TABLE myschema.table_uncompressed_parquet
STORED AS PARQUET
TBLPROPERTIES('parquet.compression'='UNCOMPRESSED')
AS
SELECT * FROM myschema.source;

运行 hdfs dfs -count /path/to/table/ 表示该表由18个文件组成,总大小为37.5 GB . 运行 hdfs fsck /path/to/table/ 表示该表由87个HDFS块组成(平均块大小为460 MB) . 18个文件的大小大致相同 - 一个文件为680 MB,其余为2 GB到2.4 GB .

现在我将此表加载到Spark(pyspark)并运行:

spark.table('myschema.table_uncompressed_parquet').rdd.getNumPartitions()

这表明Spark DataFrame有305个分区 .

如果我使用未压缩的ORC文件而不是未压缩的Parquet文件执行所有相同操作,则磁盘上的统计信息非常相似,但Spark分区的数量要低得多,为28 .

总结一下:

  • ORC表 - 18个文件,37.5 GB,87个HDFS块,305个Spark分区 .

  • Parquet表 - 15个文件,33.5 GB,139个HDFS块,28个Spark分区 .

所以,我的问题是:在每种情况下,哪些设置控制着Spark分区的数量?为什么他们如此不同?