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 Spark SQL第一个和最后一个聚合函数--意外结果_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Scala Spark SQL第一个和最后一个聚合函数--意外结果

Scala Spark SQL第一个和最后一个聚合函数--意外结果,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,在Spark Dataframe上执行第一个和最后一个聚合函数时获得意外结果 我有一个spark数据框,有colA、colB、colC、colD、colE、extraCol1、extraCol2列 我需要在这个数据帧上通过 分组->可乐和可乐,马克斯->可乐,马克斯->冷,第一->可乐,课外1,课外2 下面是我使用的数据帧(df)和spark分区(3) 下面是我用来执行groupBy操作的scala和spark的代码 val cols = List("colA","colB") var

在Spark Dataframe上执行第一个和最后一个聚合函数时获得意外结果

我有一个spark数据框,有colA、colB、colC、colD、colE、extraCol1、extraCol2列

我需要在这个数据帧上通过

分组->可乐和可乐,马克斯->可乐,马克斯->冷,第一->可乐,课外1,课外2

下面是我使用的数据帧(df)和spark分区(3)

下面是我用来执行groupBy操作的scala和spark的代码

 val cols = List("colA","colB")

 var  aggFuncSeq = List(max(`colC`) as colC_new, max(`colD`) as colD_new, first(`colE`,true) as colE, first(`extracol2`,true) as extracol2, first(`extraCol1`,true) as extraCol1)

 var aggFuncs = aggFuncSeq.map(e => expr(e))

 df = df.groupBy(cols.head, cols.tail: _*).agg(aggFuncs.head, aggFuncs.tail: _*)

 df.show(10)
在执行之后,我得到了以下意想不到的结果

colA    colB    colC_new    colD_new    colE    extracol2   extraCol1
Harshit     23      43            44        C       c       e
Aman        20      30            180       E       b       t
Kali        10      600           460       D       v       r
Ram         30      100           270       F       n       yu
Mohit       24      56            62        B       x       w
但是根据分组条件和执行的聚合操作,输出结果应该有对应于Harshit的第一行,对于colE、extracol2、extracol1

因此,预期结果如下所示

colA    colB    colC_new    colD_new    colE    extracol2   extraCol1
Harshit     23      43            44        A       q       z
Aman        20      30            180       E       b       t
Kali        10      600           460       D       v       r
Ram         30      100           270       F       n       yu
Mohit       24      56            62        B       x       w
但我无法理解SQL的概念,这是如何可能的。如果有人能帮我解决这个奇怪的问题

是因为分区吗

它是如何给出此结果的,以及如何将其修复为预期结果的

感谢您的帮助。
谢谢

当您在Spark中使用groupBy时,您可以更改数据帧的顺序。但并非总是如此(例如,如果您的数据包含在一个worker上,则不会更改)。因此,为了确保并获得可扩展的解决方案,您需要在窗口函数中重新排序

在这种情况下,请尝试以下操作:

val w = Window.partitionBy($"key").orderBy($"value")
df
  .withColumn("row_number", row_number.over(w))
  .where($"row_number" === 1)
  .drop("row_number")
这仅选择第一行,在排序后定义为行索引的
行编号
上进行过滤。因为它变得无用,所以之后会删除它


备注:您可以使用
col
运算符替换
$
运算符。这只是更简洁代码的快捷方式。

当您在Spark中使用groupBy时,您可以更改数据帧的顺序。但并非总是如此(例如,如果您的数据包含在一个worker上,则不会更改)。因此,为了确保并获得可扩展的解决方案,您需要在窗口函数中重新排序

在这种情况下,请尝试以下操作:

val w = Window.partitionBy($"key").orderBy($"value")
df
  .withColumn("row_number", row_number.over(w))
  .where($"row_number" === 1)
  .drop("row_number")
这仅选择第一行,在排序后定义为行索引的
行编号
上进行过滤。因为它变得无用,所以之后会删除它

备注:您可以使用
col
运算符替换
$
运算符。这只是更简洁代码的捷径

我能够得出预期的结果

希望这有帮助

我能够得出预期的结果


希望这有帮助

首先是窗口函数,除非你按它排序,否则它不会给你预期的结果。你需要做一些像window.partitionBy(colA,colB.orderBy(colE))@sp_user123这样的事情,然后我也可以做max(colE),它会给我同样的结果。但是我想根据userorderby(colE)提供的输入数据帧获取第一列或最后一列只是一个例子,在您的情况下,我认为您需要使用与group coulmns(desc或asc)相同的键来订购在执行任何操作之前,您可能需要添加一列
Fshuffling@TarunKhaneja请查看下面的选项,如果答案符合您的需求/问题,请不要忘记接受答案。谢谢首先是窗口函数,除非你按它排序,否则它不会给你预期的结果。你需要做一些像window.partitionBy(colA,colB.orderBy(colE))@sp_user123这样的事情,然后我也可以做max(colE),它会给我同样的结果。但是我想根据userorderby(colE)提供的输入数据帧获取第一列或最后一列只是一个例子,在您的情况下,我认为您需要使用与group coulmns(desc或asc)相同的键来订购在执行任何操作之前,您可能需要添加一列
Fshuffling@TarunKhaneja请查看下面的选项,如果答案符合您的需求/问题,请不要忘记接受答案。谢谢刚刚更新了我的答案,如果不起作用请告诉我。刚刚更新了我的答案,如果不起作用请告诉我。这并不是因为它在您的机器上起作用,所以此选项在群集上是可伸缩的。经过
groupBy
后,您无法保证数据帧将保持排序。这并不是因为此选项在您的计算机上工作,而是因为它在集群上是可伸缩的。经过
groupBy
后,您无法保证数据帧将保持排序。
 import org.apache.spark.sql.functions.{max, _}
    import spark.implicits._

    val columnsDF = Seq(
      ("Harshit", 23, 43, 44, "A", "q", "z"),
      ("Mohit", 24, 56, 62, "B", "w", "x"),
      ("Harshit", 23, 32, 44, "C", "e", "c"),
      ("Kali", 10, 20, 460, "D", "r", "v"),
      ("Aman", 20, 30, 180, "E", "t", "b"),
      ("Ram", 30, 100, 270, "F", "yu", "n"),
      ("Kali", 10, 600, 360, "G", "io", "m"),
      ("Kali", 10, 600, 460, "k", "p", "o")
    ).toDF("ColA", "ColB", "ColC", "ColD", "ColE", "extraCol1", "extraCol2")


    println("Before Aggregation")
    columnsDF.show()

    val cols = List("colA", "colB")

    println("After Aggregation")
    val aggSeqFunction = columnsDF.agg(max(columnsDF.columns(2)),
      max(columnsDF.columns(3)),
      first(columnsDF.columns(4)),
      first(columnsDF.columns(6)),
      first(columnsDF.columns(5)))

    val aggFunction = aggSeqFunction.columns.map(en => expr(en))


    columnsDF.groupBy(cols.head, cols.tail: _*).agg(aggFunction.head, aggFunction.tail: _*).show()

    /*
            +-------+----+---------+---------+------------------+-----------------------+-----------------------+
            |   colA|colB|max(ColC)|max(ColD)|first(ColE, false)|first(extraCol2, false)|first(extraCol1, false)|
            +-------+----+---------+---------+------------------+-----------------------+-----------------------+
            |Harshit|  23|       43|       44|                 A|                      z|                      q|
            |   Aman|  20|       30|      180|                 E|                      b|                      t|
            |   Kali|  10|      600|      460|                 D|                      v|                      r|
            |    Ram|  30|      100|      270|                 F|                      n|                     yu|
            |  Mohit|  24|       56|       62|                 B|                      x|                      w|
            +-------+----+---------+---------+------------------+-----------------------+-----------------------+
     */