Hadoop 如何在spark sql聚合中添加三个整数列

Hadoop 如何在spark sql聚合中添加三个整数列,hadoop,apache-spark,hive,apache-spark-sql,phoenix,Hadoop,Apache Spark,Hive,Apache Spark Sql,Phoenix,我遇到的一个问题是Spark sql聚合。我有一个数据帧,从中加载来自ApachePhoenix的记录 val df = sqlContext.phoenixTableAsDataFrame( Metadata.tables(A.Test), Seq("ID", "date", "col1", "col2","col3"), predicate = Some("\"date\" = " + date), zkUrl = Some(zkURL)) 在另一个数据帧中,我需要根据ID和日期进

我遇到的一个问题是Spark sql聚合。我有一个数据帧,从中加载来自ApachePhoenix的记录

val df = sqlContext.phoenixTableAsDataFrame(
  Metadata.tables(A.Test), Seq("ID", "date", "col1", "col2","col3"),
  predicate = Some("\"date\" = " + date), zkUrl = Some(zkURL))
在另一个数据帧中,我需要根据ID和日期进行聚合,然后求col1、col2、col3之和,即

val df1 = df.groupBy($"ID", $"date").agg(
  sum($"col1" + $"col2" + $"col3").alias("col4"))
但是我在求和的时候得到了错误的结果。如何将所有列(col1、col2、col3)求和并将其分配给col4

例如:

假设数据如下所示:

ID,date,col1,col2,col3
1,2017-01-01,5,10,12
2,2017-01-01,6,9,17
3,2017-01-01,2,3,7
4,2017-01-01,5,11,13
预期产出:

ID,date,col4 
1,2017-01-01,27
2,2017-01-01,32
3,2017-01-01,12
4,2017-01-01,29

我使用此代码得到正确的结果:

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row}
import org.apache.spark.sql.functions.{col, sum}
import org.apache.spark.sql.types.{IntegerType,  StructField, StructType}

  val rowsRdd: RDD[Row] = spark.sparkContext.parallelize(
    Seq(
      Row(1, 1, 5, 10, 12 ),
      Row(2, 1, 6, 9,  17 ),
      Row(3, 1, 2, 3,  7),
      Row(4, 1, 5, 11, 13)

    )
  )

  val schema: StructType = new StructType()
    .add(StructField("id",    IntegerType,  false))
    .add(StructField("date",  IntegerType, false))
    .add(StructField("col1",  IntegerType, false))
    .add(StructField("col2",  IntegerType, false))
    .add(StructField("col3",  IntegerType, false))
  val df0: DataFrame = spark.createDataFrame(rowsRdd, schema)

  val df = df0.groupBy(col("id"), col("date")).agg(sum(col("col1") + col("col2") + col("col3")).alias("col4")).sort("id")

  df.show()
结果是:

+---+----+----+
| id|date|col4|
+---+----+----+
|  1|   1|  27|
|  2|   1|  32|
|  3|   1|  12|
|  4|   1|  29|
+---+----+----+

这就是您所需要的吗?

我使用此代码得到了正确的结果:

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row}
import org.apache.spark.sql.functions.{col, sum}
import org.apache.spark.sql.types.{IntegerType,  StructField, StructType}

  val rowsRdd: RDD[Row] = spark.sparkContext.parallelize(
    Seq(
      Row(1, 1, 5, 10, 12 ),
      Row(2, 1, 6, 9,  17 ),
      Row(3, 1, 2, 3,  7),
      Row(4, 1, 5, 11, 13)

    )
  )

  val schema: StructType = new StructType()
    .add(StructField("id",    IntegerType,  false))
    .add(StructField("date",  IntegerType, false))
    .add(StructField("col1",  IntegerType, false))
    .add(StructField("col2",  IntegerType, false))
    .add(StructField("col3",  IntegerType, false))
  val df0: DataFrame = spark.createDataFrame(rowsRdd, schema)

  val df = df0.groupBy(col("id"), col("date")).agg(sum(col("col1") + col("col2") + col("col3")).alias("col4")).sort("id")

  df.show()
结果是:

+---+----+----+
| id|date|col4|
+---+----+----+
|  1|   1|  27|
|  2|   1|  32|
|  3|   1|  12|
|  4|   1|  29|
+---+----+----+

这就是你需要的吗?

你的投入和预期产出是什么?我已经更新了帖子。请检查您是否可以使用'data.groupBy($“ID”).agg(sum($“col1”+$“col2”+$“col3”).alias(“col4”)).show(false)获取输出?这有什么问题吗?你们得到了什么不正确的结果?谢谢shankar的回复,我想问题在于我的工作数据集。我将尝试解决它,并在这里更新,如果我发现它是相关的职位。你的投入和预期的产出是什么?我已经更新了职位。请检查您是否可以使用'data.groupBy($“ID”).agg(sum($“col1”+$“col2”+$“col3”).alias(“col4”)).show(false)获取输出?这有什么问题吗?你们得到了什么不正确的结果?谢谢shankar的回复,我想问题在于我的工作数据集。我将尝试解决它,并在这里更新,如果我发现它与文章相关。对于这个数据集(上面提供的虚拟数据集),这两个代码都在你和我的工作。可能我的问题是我的工作数据集。感谢您的回复。对于这个数据集(上面提供的虚拟数据集),这两个代码都在您和我的工作。可能我的问题是我的工作数据集。谢谢你的回复。