我正在使用Spark Dataset(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")
现在我想在多列上执行group by子句?
怎么做?
result.groupBy(_._1._1.created_at)
我可以这样做吗?
如果是,那么我不能通过如何在多个列上看到结果?
答案 0 :(得分:0)
如果我已正确理解您的要求,那么您最好的选择是在PairRDDFunctions课程中使用reduceByKey
功能。
该函数的签名是def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]
,它只是意味着您使用一系列键/值对。
让我解释一下工作流程:
result
)map
函数,您将结果集拆分为包含两个子元组的元组,其中包含组成键的字段和要聚合的字段(例如:result.map(row => ((row.key1, row.key2), (row.value1, row.value2))
)reduceByKey
传递类型(V,V) => V
的聚合值的函数(例如:(agg: (Int, Int), val: (Int, Int)) => (agg._1 + val._1, agg._2 + val._2)
)请注意:
org.apache.spark.SparkContext._
才能自动使用PairRDDFunctions实用程序功能groupBy
,您必须从起始RDD映射到一对RDD[K,V]
,但您没有聚合函数,因为您只是将值存储在seq进一步计算foldByKey
函数