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 如何在spark数据集上使用group by_Apache Spark_Dataset_Apache Spark Dataset - Fatal编程技术网

Apache spark 如何在spark数据集上使用group by

Apache spark 如何在spark数据集上使用group by,apache-spark,dataset,apache-spark-dataset,Apache Spark,Dataset,Apache Spark Dataset,我正在使用Spark数据集(Spark 1.6.1版本)。 下面是我的代码 object App { val conf = new SparkConf() .setMaster("local") .setAppName("SparkETL") val sc = new SparkContext(conf) sc.setLogLevel("ERROR") val sqlContext = new SQLContext(sc); import sqlContext.implicits._ }

我正在使用Spark数据集(Spark 1.6.1版本)。 下面是我的代码

object App { 

val conf = new SparkConf()
.setMaster("local")
.setAppName("SparkETL")

val sc = new SparkContext(conf)
sc.setLogLevel("ERROR")
val sqlContext = new SQLContext(sc);
import sqlContext.implicits._

}

override def readDataTable(tableName:String):DataFrame={
val dataFrame= App.sqlContext.read.jdbc(JDBC_URL, tableName, JDBC_PROP);
return dataFrame;
}


case class Student(stud_id , sname , saddress)
case class Student(classid, stud_id, name)


var tbl_student = JobSqlDAO.readDataTable("tbl_student").filter("stud_id = '" + studId + "'").as[Student].as("tbl_student")

var tbl_class_student = JobSqlDAO.readDataTable("tbl_class_student").as[StudentClass].as("tbl_class_student")


 var result = tbl_class_student.joinWith(tbl_student, $"tbl_student.stud_id" === $"tbl_class_student.stud_id").as("ff")
现在我想在多个列上执行GROUPBY子句? 怎么做?
result.groupBy(u.\u 1.\u 1.created\u at)
我可以这样做吗?
如果是,则我无法通过如何在多个列上执行来查看结果作为一个组?

如果我正确理解了您的要求,您最好的选择是在课堂上使用
reduceByKey
函数

函数的签名是
def reduceByKey(func:,V)⇒ 五) :RDD[(K,V)]
它只是表示您使用一系列键/值对

让我解释一下工作流程:

  • 检索要使用的集合(在代码中:
    result
  • 使用RDD
    map
    函数,可以将结果集拆分为一个元组,该元组包含两个子元组,其中包含构成键的字段和要聚合的字段(例如:
    result.map(row=>((row.key1,row.key2),(row.value1,row.value2))
  • 现在您有了一个RDD[(K,V)],其中类型K是键字段元组的类型,V是值字段元组的类型
  • 您可以通过传递类型为
    (V,V)=>V的函数直接使用
    reduceByKey
    ,该函数聚合值(例如:
    (agg:(Int,Int),val:(Int,Int))=>(agg.\u 1+val.\u 1,agg.\u 2+val.\u 2)
  • 请注意:

    • 必须从聚合函数返回相同的值类型
    • 您必须导入
      org.apache.spark.SparkContext.\u
      才能自动使用pairrdFunctions实用程序
    • 同样的道理也适用于
      groupBy
      ,您必须从起始RDD映射到一对
      RDD[K,V]
      ,但您没有聚合函数,因为您只是将值存储在一个seq中以供进一步计算
    • 如果需要聚合的起始值(例如:0表示计数),请改用
      foldByKey
      函数