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 APISQL API,是为了进一步降低开发难度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值