flink Table API 与SQL入门实战

    流处理和批处理都可以用,是非常的方便!

导入依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table_2.11</artifactId>
    <version>1.7.0</version>
</dependency>

测试案例

import org.apache.flink.streaming.api.scala.{
          
   DataStream, StreamExecutionEnvironment}
import org.apache.flink.table.api.scala.{
          
   StreamTableEnvironment, table2TableConversions}
import org.apache.flink.table.api.{
          
   Table, TableEnvironment}

object TableAPITest {
          
   
  def main(args: Array[String]): Unit = {
          
   
    //创建运行环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    //返回Scala流org.apache.flink.streaming.api.scala.StreamExecutionEnvironment的org.apache.flink.table.api.scala.StreamTableEnvironment。
    val tableenv: StreamTableEnvironment = TableEnvironment.getTableEnvironment(env)
    //读取文本文档
    val stream: DataStream[String] = env.readTextFile("a.txt")
    //导入隐式转换
    import org.apache.flink.api.scala._
    //处理从文本读取的数据,封装成User类型
    val stream1: DataStream[User] = stream.map(x => {
          
   
      val arr: Array[String] = x.split(",")
      User(arr(0).toInt, arr(1), arr(2), arr(3).toInt, arr(4).toLong)
    })
    //将给定的DataStream转换为Table。
    //Table的字段名称是自动从DataStream的类型派生的。
    //如果流中的数据类型是case class可以直接根据case class的结构生成table
    val table: Table = tableenv.fromDataStream(stream1)
    //查询一下,比如,就查询id,和sex这两列
    val table1: Table = table.select("id,sex")
    //将给定的Table转换为指定类型的附加DataStream。
    //注意,泛型要写对,比如我们上面查询的id是Int类型,sex是String类型,那么toAppendStream这块的泛型要匹配
    val value1: DataStream[(Int, String)] = table1.toAppendStream[(Int, String)]
    //打印查询后的内容
    value1.print()
    env.execute()
  }
}

case class User(id: Int, sex: String, name: String, age: Int, num: Long)

运行结果

5> (2,女)
13> (5,男)
15> (6,男)
8> (3,女)
3> (1,男)
10> (4,男)

用SQL风格查询

这种查询方式更简单些,举个例子,和上面的运行结果是一样的!

import org.apache.flink.streaming.api.scala.{
          
   DataStream, StreamExecutionEnvironment}
import org.apache.flink.table.api.scala.{
          
   StreamTableEnvironment, table2TableConversions}
import org.apache.flink.table.api.{
          
   Table, TableEnvironment}

object SQLAPITest {
          
   
  def main(args: Array[String]): Unit = {
          
   
    //创建运行环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    //table的环境是包含在上面的执行环境中的,所以从中可以获取table的执行环境
    val tableenv: StreamTableEnvironment = TableEnvironment.getTableEnvironment(env)
    //读取文本文档
    val stream: DataStream[String] = env.readTextFile("a.txt")
    //导入隐式转换
    import org.apache.flink.api.scala._
    //处理从文本读取的数据,封装成User类型
    val stream1: DataStream[User] = stream.map(x => {
          
   
      val arr: Array[String] = x.split(",")
      User(arr(0).toInt, arr(1), arr(2), arr(3).toInt, arr(4).toLong)
    })
    val table: Table = tableenv.fromDataStream(stream1)
    //以sql语法的形式查询,没注册表,因为如果向下面这种调用方式的话,会自动注册
    val result: Table = tableenv.sqlQuery(s"select id,name FROM $table")
    //table转为stream之后方便打印输出
    val value: DataStream[(Int, String)] = result.toAppendStream[(Int, String)]
    //打印查询后的内容
    value.print()
    env.execute()
  }
}

或者也可以先注册表格,然后再查询

tableenv.registerTable("user",table)
    //user要带个反单引号,因为这个user是flink的关键字,
    //所以  ,如果表明是其他的名字,可能就不需要加
val result: Table = tableenv.sqlQuery("select id,name FROM `user`")

总结

    开发 Table API 与SQL API,是为了进一步降低开发难度
经验分享 程序员 微信小程序 职场和发展