Flink读文件数据并且创建表然后用FlinkSql和TableAPI进行查询的Demo

sensor.txt

sensor_1,1547718199,35.8
sensor_6,1547718201,15.4
sensor_7,1547718202,6.7
sensor_10,1547718205,38.1
sensor_1,1547718207,37.2
sensor_1,1547718212,33.5
sensor_1,1547718215,38.1

TableAPI

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.scala._
import org.apache.flink.table.api.{DataTypes, Table}
import org.apache.flink.table.descriptors._

/**
 * 读取kafka的数据并且转成表
 */
object TableApiTest4 {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    val tableEnv = StreamTableEnvironment.create(env)

    val filePath = "D:\\20-Flink\\FlinkTutorial\\src\\main\\resources\\sensor.txt"
    tableEnv.connect(new FileSystem().path(filePath))

      .withFormat(new Csv()) // 指定csv格式,就是逗号分割的格式,因为kafka输入的数据就是这个格式的.
      //创建每个字段的名字和类型
      .withSchema(new Schema()
        .field("id", DataTypes.STRING())
        .field("timestamp", DataTypes.BIGINT())
        .field("temperature", DataTypes.DOUBLE())
      )
      // 创建表名
      .createTemporaryTable("inputTable")


    //    表的查询
    val sensorTable: Table = tableEnv.from("inputTable")
    val resultTable: Table = sensorTable
      .select('id, 'temperature)
      .filter('id === "sensor_1") //等于是 三个等号,

    resultTable.toAppendStream[(String, Double)].print("TableAPI")


    env.execute("table api test job")
  }
}

结果:

TableAPI> (sensor_1,35.8)
TableAPI> (sensor_1,37.2)
TableAPI> (sensor_1,33.5)
TableAPI> (sensor_1,38.1)

FlinkSql

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.scala._
import org.apache.flink.table.api.{DataTypes, Table}
import org.apache.flink.table.descriptors._

/**
 * 读取kafka的数据并且转成表
 */
object TableApiTest4 {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    val tableEnv = StreamTableEnvironment.create(env)

    val filePath = "D:\\20-Flink\\FlinkTutorial\\src\\main\\resources\\sensor.txt"
    tableEnv.connect(new FileSystem().path(filePath))

      .withFormat(new Csv()) // 指定csv格式,就是逗号分割的格式,因为kafka输入的数据就是这个格式的.
      //创建每个字段的名字和类型
      .withSchema(new Schema()
        .field("id", DataTypes.STRING())
        .field("timestamp", DataTypes.BIGINT())
        .field("temperature", DataTypes.DOUBLE())
      )
      // 创建表名
      .createTemporaryTable("inputTable")



    //    SQL简单查询
    val resultSqlTable: Table = tableEnv.sqlQuery(
      """
        |select id, temperature
        |from inputTable
        |where id = 'sensor_1'
          """.stripMargin)
    resultSqlTable.toAppendStream[(String, Double)].print("FlinkSql")


    env.execute("table api test job")
  }
}

结果:

FlinkSql> (sensor_1,35.8)
FlinkSql> (sensor_1,37.2)
FlinkSql> (sensor_1,33.5)
FlinkSql> (sensor_1,38.1)
第一章 整体介绍 2 1.1 什么是 Table APIFlink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释和执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理的特殊概念 20 3.1 流处理和关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
好的,下面是一个使用 Flink SQL 读取 Kafka 多个表的示例 Maven 依赖和代码: 1. Maven 依赖: ```xml <!-- Flink Kafka Connector --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Flink SQL --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge_2.12</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner_2.12</artifactId> <version>${flink.version}</version> </dependency> ``` 2. 代码示例: ```java import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.descriptors.Kafka; import org.apache.flink.table.descriptors.Schema; import org.apache.flink.table.types.DataType; import org.apache.flink.table.types.FieldsDataType; import java.util.Properties; public class KafkaMultiTableDemo { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings); // 定义 Kafka Consumer 配置 Properties kafkaProps = new Properties(); kafkaProps.setProperty("bootstrap.servers", "localhost:9092"); kafkaProps.setProperty("group.id", "test-group"); // 定义 FlinkKafkaConsumer FlinkKafkaConsumer<String> consumer1 = new FlinkKafkaConsumer<>("topic1", new SimpleStringSchema(), kafkaProps); FlinkKafkaConsumer<String> consumer2 = new FlinkKafkaConsumer<>("topic2", new SimpleStringSchema(), kafkaProps); // 读取 Kafka 数据流 DataStream<String> stream1 = env.addSource(consumer1); DataStream<String> stream2 = env.addSource(consumer2); // 定义 Schema Schema schema1 = new Schema() .field("id", DataType.INT()) .field("name", DataType.STRING()) .field("age", DataType.INT()); Schema schema2 = new Schema() .field("id", DataType.INT()) .field("gender", DataType.STRING()) .field("address", DataType.STRING()); // 将数据流转换为 Table tableEnv.connect(new Kafka() .version("universal") .topic("topic1") .startFromEarliest() .property("bootstrap.servers", "localhost:9092") .property("group.id", "test-group")) .withFormat(new Json()) .withSchema(schema1) .createTemporaryTable("table1"); tableEnv.connect(new Kafka() .version("universal") .topic("topic2") .startFromEarliest() .property("bootstrap.servers", "localhost:9092") .property("group.id", "test-group")) .withFormat(new Json()) .withSchema(schema2) .createTemporaryTable("table2"); // 使用 Flink SQL 查询多个表 Table result = tableEnv.sqlQuery("SELECT t1.id, t1.name, t2.gender, t2.address FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id"); // 输出结果 result.printSchema(); tableEnv.toRetractStream(result, FieldsDataType.ROW(FieldsDataType.FIELD("id", DataType.INT()), FieldsDataType.FIELD("name", DataType.STRING()), FieldsDataType.FIELD("gender", DataType.STRING()), FieldsDataType.FIELD("address", DataType.STRING()))).print(); env.execute(); } } ``` 注意事项: - Flink Kafka Connector 和 Flink SQL 的版本需一致。 - Schema 的字段名称和类型需和 Kafka 的一致。 - Flink SQL 查询多个表时,需要使用 JOIN 连接。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值