Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Apache spark 当我在窗口中使用partitionBy时,为什么使用spark/scala会得到不同的结果?_Apache Spark_Apache Spark Sql - Fatal编程技术网

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)


希望你明白了

我刚才在你的另一个问题中回答了这个问题