Flink快速入门三(Transformation编程)

1.简介

Flink的Transformation算子和Spark的算子很类似,只要熟悉了Spark,使用scala进行Flinl的编程,是非常简单方便的事儿。transformation编程官网指导,如下简单列举了join和cross的transformation编程。

2.join & cross编程案例

package com.wsk.flink.transformations

import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.api.scala._
import scala.collection.mutable.ListBuffer


object TransformationApp {

  def main(args: Array[String]): Unit = {

    val env = ExecutionEnvironment.getExecutionEnvironment

//    innerJoinFunction(env)
//    outerJoinFunction(env)
    crossFunction(env)
  }

  /**
    * innerjoin 操作
    *
    * @param env
    */
  def innerJoinFunction(env: ExecutionEnvironment): Unit = {

    val data1 = ListBuffer[(Int, String)]() // id name
    data1.append((1, "zwr"))
    data1.append((2, "wsk"))
    data1.append((3, "小wsk"))

    val data2 = ListBuffer[(Int, String)]() //id adress
    data2.append((1, "北京"))
    data2.append((2, "上海"))
    data2.append((3, "上海"))

    val left = env.fromCollection(data1)
    val right = env.fromCollection(data2)

    left.join(right)
      .where(0)
      .equalTo(0)
      .apply((left, right) => {
        (left._1, left._2, right._2)
      })
      .print()

  }

  /**
    * outerJoin 操作
    *
    * @param env
    */
  def outerJoinFunction(env: ExecutionEnvironment): Unit = {
    val data1 = ListBuffer[(Int, String)]() // id name
    data1.append((1, "zwr"))
    data1.append((2, "wsk"))
    data1.append((3, "小wsk"))

    val data2 = ListBuffer[(Int, String)]() //id 户籍
    data2.append((1, "北京"))
    data2.append((2, "上海"))
    data2.append((4, "上海"))

    val left = env.fromCollection(data1)
    val right = env.fromCollection(data2)
    println("======= 左外连接 =============")
    //左外连接
    left.leftOuterJoin(right)
      .where(0)
      .equalTo(0)
      .apply((left, right) => {
        if(right == null){
          (left._1, left._2, "-")
        }else{
          (left._1, left._2, right._2)
        }
      })
      .print()

    println("======= 右外连接 =============")
    //右外连接
    left.rightOuterJoin(right)
      .where(0)
      .equalTo(0)
      .apply((left, right) => {
        if(left == null){
          (right._1, "-", right._2)
        }else{
          (right._1, left._2, right._2)
        }
      })
      .print()
    println("======= 全外连接 =============")
    //全外连接
    left.fullOuterJoin(right)
      .where(0)
      .equalTo(0)
      .apply((left, right) => {
        if(left == null){
          (right._1, "-", right._2)
        }else if(right == null){
          (left._1, left._2, "-")
        }else{
          (right._1, left._2, right._2)
        }
      })
      .print()
  }

  /**
    * cross 操作,笛卡尔积操作
    * @param env
    */
  def crossFunction(env: ExecutionEnvironment): Unit ={
    val data1 = List("wsk","zwr")
    val data2 = List("001","002")

    val left = env.fromCollection(data1)
    val right = env.fromCollection(data2)
    left.cross(right).print()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值