spark函数学习---(Dateset)
1.代码
// map:将数据集中的每条数据都做一个映射,返回一条新数据 // flatMap:数据集中的每条数据都可以返回多条数据 // mapPartitions:一次性对一个partition中的数据进行处理 employeeDS.map { employee => (employee.name, employee.salary + 1000) }.show() departmentDS.flatMap { department => Seq(Department(department.id + 1, department.name + "_1"), Department(department.id + 2, department.name + "_2")) }.show() employeeDS.mapPartitions { employees => { val result = scala.collection.mutable.ArrayBuffer[(String, Long)]() while(employees.hasNext) { var emp = employees.next() result += ((emp.name, emp.salary + 1000)) } result.iterator } }.show()
2.代码 Dateset两个表进行连接
employeeDS.joinWith(departmentDS, $"depId" === $"id").show()
3.代码
// 排序
employeeDS.sort($"salary".desc).show()
4.代码
//切分:randomSplit,sample
//randomSplit(Array(3, 10, 20)) 切分权重,第一个是切3份
val employeeDSArr = employeeDS.randomSplit(Array(3, 10, 20)) employeeDSArr.foreach { ds => ds.show() } //抽取0.3的比例切分 employeeDS.sample(false, 0.3).show()
5.聚合函数
employee .join(department, $"depId" === $"id") .groupBy(department("name")) .agg(avg(employee("salary")), sum(employee("salary")), max(employee("salary")), min(employee("salary")), count(employee("name")), countDistinct(employee("name"))) .show()
6.代码
// collect_list和collect_set,都用于将同一个分组内的指定字段的值串起来,变成一个数组 // 常用于行转列 // 比如说 // depId=1, employee=leo // depId=1, employee=jack // depId=1, employees=[leo, jack] //---两个的区别 collect_list是不会去重的。collect_set会去重
employee .groupBy(employee("depId")) .agg(collect_set(employee("name")), collect_list(employee("name"))) .collect() .foreach(println(_))
7.其他函数要查官网
// 日期函数:current_date、current_timestamp // 数学函数:round // 随机函数:rand // 字符串函数:concat、concat_ws //concat和concat_ws的区别。都是两个字段的值连接。concat_ws可以指定两个字段值中间加字符 // 自定义udf和udaf函数 // http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions$ employee .select(employee("name"), current_date(), current_timestamp(), rand(), round(employee("salary"), 2), concat(employee("gender"), employee("age")), concat_ws("|", employee("gender"), employee("age"))) .show()
浙公网安备 33010602011771号