1. map和mapPartition
将DataSet中的每一个元素转换为另外一个元素
示例
使用map操作,将以下数据转换为一个scala的样例类。
“1,张三”, “2,李四”, “3,王五”, “4,赵六”
注意
map和mapPartition的效果是一样的,
但如果在map的函数中,需要访问一些外部存储,如:访问mysql数据库,需要打开连接, 此时效率较低。
而使用mapPartition可以有效减少连接数,提高效率
参考代码
import org.apache.flink.api.scala.ExecutionEnvironment
/**
* 演示转换操作
*/
object BatchTransformation {
def main(args: Array[String]): Unit = {
//获取env
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala._
//map
val data: DataSet[String] = env.fromCollection(List("1,张三", "2,李四", "3,王五", "4,赵六"))
case class User(id: String, name: String)
val userDataSet: DataSet[User] = data.map(text => {
val files = text.split(",")
User(files(0), files(1))
})
userDataSet.print()
//mapPartition
val userDataSet2 = data.mapPartition(iter => {
// TODO:打开连接
iter.map(ele => {
val files = ele.split(",")
User(files(0), files(1))
})
// TODO:关闭连接
}
)
userDataSet2.print()
}
}
2. flatMap
flatMap的用法和之前学习Spark中的一模一样,今天学习一个新的用法
将DataSet中的每一个元素转换为另一个集合并压平为多个元素
将DataSet中的每一个元素转换为0~n个元素
示例
分别将以下数据,转换成国家、省份、城市三个维度的数据。
将以下数据
张三,中国,江西省,南昌市
李四,中国,河北省,石家庄市
转换为
(张三,中国)
(张三,中国,江西省)
(张三,中国,江西省,南昌市)
(李四,中国)
(李四,中国,河北省)
(李四,中国,河北省,石家庄市)
思路
- 以上数据为一条转换为三条,显然,应当使用flatMap来实现
- 分别在flatMap函数中构建三个数据,并放入到一个列表中
List(
(姓名, 国家),
(姓名, 国家, 省份),
(姓名, 国家, 省份, 城市)
)
参考代码
//flatMap
val data2 = env.fromCollection(List(
"张三,中国,江西省,南昌市",
"李四,中国,河北省,石家庄市"
))
//使用flatMap将一条数据转换为三条数据
val resultDataSet: DataSet[(String, String)] = data2.flatMap(text => {
val fieldArr = text.split(",")
List(
(fieldArr(0), fieldArr(1)),
(fieldArr(0), fieldArr(1) , fieldArr(2)),
(fieldArr(0), fieldArr(1) , fieldArr(2) , fieldArr(3))
)
}
)
resultDataSet.print()
//(张三,中国)
//(张三,中国,江西省)
//(张三,中国,江西省,南昌市)
//(李四,中国)
//(李四,中国,河北省)
//(李四,中国,河北省,石家庄市)
3. filter
Filter函数在实际生产中特别实用,数据处理阶段可以过滤掉大部分不符合业务的内容,可以极大减轻整体flink的运算压力
示例:
过滤出来以下以长度>4的单词。
“hadoop”, “hive”, “spark”, “flink”
参考代码
//filter
val wordDataSet = env.fromCollection(List("hadoop", "hive", "spark", "flink"))
val resultDataSet2 = wordDataSet.filter(_.length > 4)
resultDataSet2.print()
4. reduce
可以对一个dataset或者一个group来进行聚合计算,最终聚合成一个元素
示例1
请将以下元组数据,使用reduce操作聚合成一个最终结果
(“java” , 1) , (“java”, 1) ,(“java” , 1)
将上传元素数据转换为(“java”,3)
示例2
请将以下元组数据,下按照单词使用groupBy进行分组,再使用reduce操作聚合成一个最终结果
(“java” , 1) , (“java”, 1) ,(“scala” , 1)
转换为
(“java”, 2), (“scala”, 1)
参考代码
//reduce
val wordCountDataSet: DataSet[(String, Int)] = env.fromCollection(List(("java" , 1) , ("java", 1) ,("java" , 1)))
val resultDataSet3 = wordCountDataSet.reduce((wc1, wc2) => (wc2._1, wc1._2 + wc2._2))
resultDataSet3.print()
//groupBy+reduce
val wordcountDataSet2: DataSet[(String, Int)] = env.fromCollection(List(("java" , 1) , ("java", 1) ,(