背景
spark官方example文件夹中提供了people.json的一份测试数据,并结合官方dataset使用方式的介绍,我们可以做一些练习,准备好的数据可以到这里下载:https://download.csdn.net/download/u013560925/10342251。
数据json读取时候的dataframe格式如下:
people.json:对应用户姓名和年龄
peopleScore.json: 对应用户的姓名和分数
!!之前使用的2.1的api,现在转为了较新的2.2的api,注意!在此说明spark和sql相关版本信息如下,如果版本不一致,api的使用方式会有所出入:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.0</version>
<scope>compile</scope>
</dependency>
正文
本次涉及练习的api方法有:joinwith、groupBy、countDistinct、agg、sample、sort、dropDuplicates、join、mapPartition
dataset是强类型的数据集合,所以在很多时候都需要as[Int]等操作来生命数据类型,这是dataframe所不需要的。
0. 相关初始化和导入准备
初始化:
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
//注意要单独引入以下引用包!!!!
import spark.implicits._ //隐式转换
import org.apache.spark.sql.functions._ //agg内置算法
1. joinWith
2.1 spark版本的条件是可以直接用字符串的,比如($"name"===$"n"),在2.2版本中就必须列来表示。
personsDS.joinWith(personScoresDS,personsDS("name")===personScoresDS("n")).show
2. groupBy+countDistinct
personsDS.groupBy("name").agg(sum("age").as[Int],countDistinct("age").as[Int],current_date().as[String]).show()
3. agg
personsDS.groupBy("name").agg(collect_list("name").as[String],collect_set("age").as[Int])
4. sample
personsDS.sample(false,0.5).show()
5. sort
personsDS.sort("age").show()
6. dropDuplicates
personsDS.dropDuplicates("name").show
6. join
personsDS.join(personScoresDS,personsDS("name")===personScoresDS("n")).show
7. mapPartition
def doubleFunc(iter: Iterator[Person]) : Iterator[(String,Long)] = {
var res = ArrayBuffer[(String,Long)]()
while (iter.hasNext)
{
val cur = iter.next;
res+=((cur.name,cur.age+1000))
}
res.iterator
}
personsDS.mapPartitions(doubleFunc)
结论
1.spark core和sql版本很重要,版本不同api使用方式不同
2.使用官方javadoc查看api使用方式,对应版本查询
3.百度得到的方法,很可能因为版本不一样而无法使用