背景
Spark版本:2.2
DataSet API网址:http://spark.apache.org/docs/2.2.1/api/java/org/apache/spark/sql/Dataset.html
正文
1.groupBy()
a.使用方法
按照某几列元素进行分组
dataset.groupBy("columnName","columnName")
dataset.groupBy(dataset("columnName"))
b.注意事项
运算完成之后,返回的不是普通的DataSet数据类型,而是org.apache.spark.sql.RelationalGroupedDataset
org.apache.spark.sql.RelationalGroupedDataset可是用的方法有max、min、agg和sum等少量函数
c.使用举例
logDS.groupBy("userID").max()
2.agg()
a.使用方法
dataset 聚合函数api,有多种列名的传入方式,使用as,可是重新命名,所有计算的列sum、avg或者distinct都会成为新的列,默认列明sum(columnName),常常跟在groupBy算子后使用
dataset.agg(sum(dataset("columnsName")),sum(dataset("")).as("newName"))
dataset.agg(sum("columnsName"),avg("columnsName").as("newName"))
b.注意事项
如果想要使用更多的内置函数,请引入: import org.apache.spark.sql.functions._
计算完会生成新的列,所以一般放了方便后期使用,会进行重命名
c.使用举例
经长和groupBy后使用,对同一group内的数据操作
logDs.groupBy("userID").agg(max("consumed"),max("logID"))
3.sortWithinPartition()
a.使用方法
在分区内部进行排序,执行完成后,分区内部有序
dataset.sortWithinPartitions("columnName1","columnName2")
b.注意事项
一般在调用改方法之前,会按照规则将数据重新分区,否则没有意义
调用之后可以接foreachPartition()遍历每一个分区
但是奇怪的是,我没有查到dataset相关分区的方法,只有rdd(key-value)才有分区的能力,所以,这个方法的使用意义和环
境暂时还不清楚,使用的频率也较低
c.使用举例
personsDS.sortWithinPartitions("name").mapPartitions(it=>{
it.toList.reverse.iterator
})
4.sort()
a.使用方法
按照某几列进行排序
dataset.sort(dataset("name"),dataset("age").desc