我有一个存储在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分区的数量?为什么他们如此不同?