Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在将RDD转换为数据帧时,是什么导致重新分区?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 在将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

我使用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,因此所有的值都被分组在一个数据帧中,以便进行排序,从而将数据洗牌到一个分区中

但在第二个例子中,您在值本身上定义了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)

通过这样做,我看到您原来的分区被保留了。

我该怎么做?您所说的我该怎么做是什么意思?我该怎么做才能获得与分区相同的结果?我将在您的另一个问题中回答。如果你觉得没问题,请用此评论的问题更新其他问题。