Scala 在将RDD转换为数据帧时,是什么导致重新分区?
我使用Window.sum函数获取RDD中某个值的和,但是当我将数据帧转换为RDD时,我发现结果只有一个分区。什么时候进行重新分区Scala 在将RDD转换为数据帧时,是什么导致重新分区?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我使用Window.sum函数获取RDD中某个值的和,但是当我将数据帧转换为RDD时,我发现结果只有一个分区。什么时候进行重新分区 val rdd = sc.parallelize(List(1,3,2,4,5,6,7,8), 4) val df = rdd.toDF("values"). withColumn("csum", sum(col("values")).over(Window.orderBy("values"))) df.show() pri
val rdd = sc.parallelize(List(1,3,2,4,5,6,7,8), 4)
val df = rdd.toDF("values").
withColumn("csum", sum(col("values")).over(Window.orderBy("values")))
df.show()
println(s"numPartitions ${df.rdd.getNumPartitions}")
// 1
//df is:
// +------+----+
// |values|csum|
// +------+----+
// | 1| 1|
// | 2| 3|
// | 3| 6|
// | 4| 10|
// | 5| 15|
// | 6| 21|
// | 7| 28|
// | 8| 36|
// +------+----+
我在窗口中添加了partitionBy,但结果是错误的,我应该怎么做?这是我的更改代码:
val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4)
val sqlContext = new SQLContext(m_sparkCtx)
import sqlContext.implicits._
val df = rdd.toDF("values").withColumn("csum", sum(col("values")).over(Window.partitionBy("values").orderBy("values")))
df.show()
println(s"numPartitions ${df.rdd.getNumPartitions}")
//1
//df is:
// +------+----+
// |values|csum|
// +------+----+
// | 1| 1|
// | 6| 6|
// | 3| 3|
// | 5| 5|
// | 4| 4|
// | 8| 8|
// | 7| 7|
// | 2| 2|
// +------+----+
Window函数有partitionBy api用于对数据帧进行分组,orderBy用于按升序或降序对分组的行进行排序
在第一种情况下,您没有定义partitionBy,因此所有的值都被分组在一个数据帧中,以便进行排序,从而将数据洗牌到一个分区中
但在第二个例子中,您在值本身上定义了partitionBy。因此,由于每一个值都是不同的,所以每一行都被分组为单独的组
第二种情况下的分区是200,因为这是在spark中定义的默认分区,当您还没有定义分区时,会发生洗牌
要获得与第一个案例相同的结果,您需要添加另一个具有分组值的列,以便可以像第一个案例那样对它们进行分组,即将它们分组到一个组中
val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4)
val df = rdd.toDF("values").withColumn("grouping", lit("group"))
df.withColumn("csum", sum(col("values")).over(Window.partitionBy("grouping").orderBy("values"))).drop("grouping").show(false)
通过这样做,我看到您原来的分区被保留了。我该怎么做?您所说的我该怎么做是什么意思?我该怎么做才能获得与分区相同的结果?我将在您的另一个问题中回答。如果你觉得没问题,请用此评论的问题更新其他问题。