объединить две строки информационного кадра в scala spark - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть DataFrame с теми же записями, за исключением поля суммы, и я хочу объединить его в одну строку и поля суммы, которые имеют сумму обеих сумм. Как бы я это сделал? В scala.

I get the dataframe from a database:

val my_table = spark.read.table("table.myTable")
val df = my_table
.filter(col("ID")==="10") and
.filter(col("CENT")==="20") and
.filter(col("PROD")=== "122") and
.filter(col("CONTR").isin("0004", "0005", "0006"))).select(
"ID", "CENT", "PROD", "CONTR", "COD", "DATE", "AMOUNT").distinct()

df.show()


---------+--------+--------------+------------+-------------+-----------+--------+
ID       | CENT   | PROD         |CONTR       |COD          | DATE      | Amount |    
---------+--------+--------------+------------+-------------+-----------+--------+
10       |20      |122           |0004        |COD1         |2006-11-04 | 150.0  |
10       |20      |122           |0004        |COD1         |2006-11-04 | 300.0  |
10       |20      |122           |0005        |COD2         |2012-10-17 | 100.0  |
10       |20      |122           |0006        |COD3         |2015-12-05 | 500.0  |
---------+--------+--------------+------------+-------------+-----------+--------+

Expected:

---------+--------+--------------+------------+-------------+-----------+--------+
ID       | CENT   | PROD         |CONTR       |COD          | DATE      | Amount |    
---------+--------+--------------+------------+-------------+-----------+--------+
10       |20      |122           |0004        |COD1         |2006-11-04 | 450.0  |
10       |20      |122           |0005        |COD2         |2012-10-17 | 100.0  |
10       |20      |122           |0006        |COD3         |2015-12-05 | 500.0  |
---------+--------+--------------+------------+-------------+-----------+--------+

1 Ответ

0 голосов
/ 24 апреля 2020

Ниже код группирует все столбцы, кроме amount, и запускает агрегацию sum в столбце amount и упорядочивает их по cod

object GroupBy {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[*]").getOrCreate();
    import spark.implicits._
    val df = List(Bean3(10,20,122,"0004","COD1","2006-11-04",150.0),
      Bean3(10,20,122,"0004","COD1","2006-11-04",300.0),
      Bean3(10,20,122,"0005","COD2","2012-10-17",100.0),
      Bean3(10,20,122,"0006","COD3","2015-12-05",500.0)
    ).toDF
    val groupByCol = df.columns.diff(Array("id", "amount"))
    df.groupBy("id",groupByCol: _*).sum("amount")
      .withColumnRenamed("sum(amount)","amount")
      .orderBy("cod")
      .show()
  }

}

case class Bean3(id : Int,cent : Int,prod: Int,contr : String,cod : String,date : String,amount : Double)


+---+----+----+-----+----+----------+------+
| id|cent|prod|contr| cod|      date|amount|
+---+----+----+-----+----+----------+------+
| 10|  20| 122| 0004|COD1|2006-11-04| 450.0|
| 10|  20| 122| 0005|COD2|2012-10-17| 100.0|
| 10|  20| 122| 0006|COD3|2015-12-05| 500.0|
+---+----+----+-----+----+----------+------+
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...