流处理
和批处理
都可以用,是非常的方便!
导入依赖
<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
,是为了进一步降低开发难度