我对shuffle和分区有一些逻辑上的怀疑。假设我有一个类似这样的Dataframe:
DataFrame groupDF = hiveContext.sql("Select col from table group by col");
在此之后,我将此数据帧转换为javaRDD,以便我可以执行一些地图操作,如下所示:
JavaRDD<Row> mappedRDD = groupDF.toJavaRDD().map();
当我这样做时,我得到一个名为 toJavaRDD 的舞台。我无法理解为什么它需要洗牌,如果我没有这个洗牌的团队也不会发生。
其他情景:
在创建数据帧后,我会使用某个值进行合并,比方说100。当我将此数据帧转换为rdd时,在javaRDD阶段启动的任务数量不是100.我做主要合并的主要目的不是减少分区和因此任务。但是,一旦我将其转换为RDD,就不会保留合并因子。我已经观察到了重新分配。
Dataframe groupDF = hiveContext.sql("Select col from table group by col").coalesce(100);
JavaRDD<Row> coalescedRDD = groupDF.toJavaRDD(); // shuffle happens and tasks are not 100. They are more than 100.
请指导我完成这个。我有镶木地板格式的数据
更新:我明白为什么会发生洗牌。但是,当我从数据帧转换为RDD时,为什么我无法保留多个分区仍然是一个问题。