背景
今天在做一个spark dataset练习的时候,遇到一个agg聚合函数,但是怎么用,都编译不过,然后百度啥的给的也不权威,最后找到一个spark官方的api网站,有较为详细的使用介绍。
正文
网站
网址: http://spark.apache.org/docs/2.2.1/api/java/allclasses-noframe.html
网站截图:
搜索类别,点击进入详情:
select的使用举例:
举例
val personsDF = spark.read.json("/data/wangqi/people.json") val personScoreDF = spark.read.json("/data/wangqi/peopleScores.json") case class Person(name:String,age:Long) //prac val personDSGrouped = personsDF.groupBy("name","age").count().show() personsDF.groupBy("name","age").agg(concat($"name",$"age")).show()
如上agg函数,是dataframe.agg() 内部使用了内置函数concat,concat()内部只填列名就行了,但是将dataframe转换成dataset之后,就不行了:
import spark.implicits._ import org.apache.spark.sql.functions._ val personsDF = spark.read.json("/data/wangqi/people.json") val personScoreDF = spark.read.json("/data/wangqi/peopleScores.json") case class Person(name:String,age:Long) case class Score(n:String,score:Long) val personsDS = personsDF.as[Person] val personScoresDS = personScoreDF.as[Score] //dataset 强类型 personsDS.groupBy($"name",$"age").count().show() personsDS.groupBy($"name",$"age").agg(concat($"name",$"age"))我看了一下dataset.agg 要求的参数类型如下:
typedcolumn类型的参数,然后我就到上面提到的文章中,到dataset类,搜到了一个类似的使用用例:
其实就是因为,我的dataset是转换过类型的,不是dataset[Row],而是dataset[Persion],所以选择列的时候要附带类型信息。修改代码以后如下,添加as[String]类型信息:
personsDS.groupBy($"name",$"age").agg(concat($"name",$"age").as[String])
总结
相对于百度必应搜索得到的资料,版本和权威性都无法保证,不如直接到spark提供的权威网站,而且还有丰富的使用样例