Flink核心API之DataSet

DataSet:批式处理。DataSet API主要可以分为3块来分析:DataSource、Transformation、Sink。

  • DataSource是程序的数据源输入。
  • Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,例如map、flatMap、filter 等操作。
  • DataSink是程序的输出,它可以把Transformation处理之后的数据输出到指定的存储介质中。

一、DataSet API之DataSource

  • 基于集合 fromCollection(Collection),主要是为了方便测试使用。它的用法和DataStreamAPI中的用法一 样,我们已经用过很多次了。
  • 基于文件 readTextFile(path),读取hdfs中的数据文件。

二、DataSet API之Transformation

  • map 输入一个元素进行处理,返回一个元素
  • mapPartition 类似map,一次处理一个分区的数据
  • flatMap 输入一个元素进行处理,可以返回多个元素
  • filter 对数据进行过滤,符合条件的数据会被留下
  • reduce 对当前元素和上一次的结果进行聚合操作
  • aggregate sum(),min(),max()等
  • distinct 返回数据集中去重之后的元素
  • join 内连接
  • outerJoin 外连接
  • cross 获取两个数据集的笛卡尔积
  • union 返回多个数据集的总和,数据类型需要一致
  • first-n 获取集合中的前N个元素

2.1 mapPartition代码

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")

  }

Flink核心API之DataSet_第1张图片

注意:针对DataSetAPI,如果在后面调用的是count、collect、print,则最后不需要加 :env.execute("BatchMapPartitionScala"),否则会报错

2.2  join 内连接,可以连接两份数据集

 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的效果

2.3 outerJoin 外连接

一共有三种情况 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()
  }

Flink核心API之DataSet_第2张图片

 2.4 first-n 获取集合中的前N个元素


  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核心API之DataSet_第3张图片

三、DataSet API之DataSink

Flink针对DataSet提供了一些已经实现好的数据目的地 其中最常见的是向HDFS中写入数据

  • writeAsText():将元素以字符串形式逐行写入,这些字符串通过调用每个元素的toString()方法来获取
  • writeAsCsv():将元组以逗号分隔写入文件中,行及字段之间的分隔是可配置的,每个字段的值来自对象 的toString()方法

你可能感兴趣的:(大数据,flink,大数据)