DataSet:批式处理。DataSet API主要可以分为3块来分析:DataSource、Transformation、Sink。
MapPartition的使用:一次处理一个分区的数据
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
val text = env.fromCollection(Array("hello you","hello me"))
text.mapPartition(it => {
val res = ListBuffer[String]()
it.foreach(line => {
//可以在此处创建数据库连接,建议把这块代码放到try-catch代码块中
//意:此时是每个分区获取一个数据库连接,不需要每处理一条数据就获取一次连接,
val words = line.split(" ")
for (word <- words) {
res.append(word)
}
}
)
res
}).print()
// env.execute("BatchMapPartitionScala")
}
注意:针对DataSetAPI,如果在后面调用的是count、collect、print,则最后不需要加 :env.execute("BatchMapPartitionScala"),否则会报错
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala._
//初始化第一份数据 Tuple2<用户id,用户姓名>
val text1 = env.fromCollection(Array((1, "jack"), (2, "tom"), (3, "mick")))
//初始化第二份数据 Tuple2<用户id,用户所在城市>
val text2 = env.fromCollection(Array((1, "bj"), (2, "sh"), (4, "gz")))
text1.join(text2).where(0).equalTo(0) { (first, second) => {
(first._1, first._2, second._1)
}
}.print()
}
这里的where和equalTo实现了类似于on fieldA=fieldB的效果
一共有三种情况 1:leftOuterJoin 2:rightOuterJoin 3:fullOuterJoin
代码:
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala._
//初始化第一份数据 Tuple2<用户id,用户姓名>
val text1 = env.fromCollection(Array((1, "jack"), (2, "tom"), (3, "mick")))
//初始化第二份数据 Tuple2<用户id,用户所在城市>
val text2 = env.fromCollection(Array((1, "bj"), (2, "sh"), (4, "gz")))
text1.leftOuterJoin(text2).where(0).equalTo(0) { (first, second) => {
if(second==null){
(first._1, first._2, null)
}else{
(first._1, first._2, second._2)
}
}
}.print()
}
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
val data = ListBuffer[Tuple2[Int,String]]()
data.append((2,"zs"))
data.append((4,"ls"))
data.append((3,"ww"))
data.append((1,"aw"))
data.append((1,"xw"))
data.append((1,"mw"))
import org.apache.flink.api.scala._
//初始化数据
val text = env.fromCollection(data)
//获取前3条数据,按照数据插入的顺序
text.first(3).print()
println("==================================")
//根据数据中的第一列进行分组,获取每组的前2个元素
text.groupBy(0).first(2).print()
println("==================================")
//根据数据中的第一列分组,再根据第二列进行组内排序[倒序],获取每组的前2个元素
//分组排序取TopN
text.groupBy(0).sortGroup(1,Order.DESCENDING).first(2).print()
}
Flink针对DataSet提供了一些已经实现好的数据目的地 其中最常见的是向HDFS中写入数据