我正在使用pyspark(大约10个执行器和每个执行器4-5个内核)将云存储中的一些数据以Parquet格式读入sparkDataframe。这个 spark.sql.files.maxPartitionBytes
是在加载之前设置的,以便我可以控制每个分区的大小,进而控制可以获得的分区的大小。加载数据后,我对数据应用spark函数/udf。因此,不应该出现洗牌(join和groupby)。我期望每个分区在加载后具有相对相等的分区大小,但实际情况是加载的数据非常倾斜。
当查看yarn时,最小、25%、中间、75%的分区大小都是21b(基本上是空分区),而最大分区大小是100mb,其中所有行都被加载。
我现在要做的是做一个 df.repartition()
加载后立即均匀分布,效果良好。但这又引入了一次不理想的数据洗牌。
所以问题是,为什么在加载之后,默认情况下分区会高度倾斜?有没有一种方法可以用相对均匀的分区大小加载它们并跳过它 df.repartition()
台阶?
谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!