Apache spark 当我在窗口中使用partitionBy时,为什么使用spark/scala会得到不同的结果?
我使用Apache spark 当我在窗口中使用partitionBy时,为什么使用spark/scala会得到不同的结果?,apache-spark,apache-spark-sql,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
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()
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
,因此所有值都被分组在一个dataframe
中,以便于排序,从而将数据重新排列到一个分区中
但在第二种情况下,您在值
本身上定义了partitionBy
。因此,由于每一个值都是不同的,所以每一行都被分组为单独的组
第二种情况下的分区是200,因为这是spark
中定义的默认分区,当您还没有定义分区时,会发生无序排列
要从第二个案例中获得与第一个案例相同的结果,您需要将
数据帧
分组为第一个案例中的数据帧,即分组为一组。为此,您需要创建另一个具有常量值的列
,并在将列创建为withColumn(“csum”、sum(col(“值”)).over(Window.orderBy(“值”))
Window.orderBy(“values”)
正在对单个分区中“values”列的值进行排序,因为您尚未定义定义分区的partitionBy()
方法
这将分区的数量从最初的4更改为1
在第二种情况下,分区是200,因为partitionBy()
方法使用200作为默认分区。如果需要分区数为4,可以使用类似于重新分区(4)
或合并(4)
希望你明白了 我刚才在你的另一个问题中回答了这个问题