FlinkSQL系列05-表与流

本文深入探讨了Apache Flink中的动态表概念,特别是changelogStream,它是用于传递表更新信息的数据流。changelogStream以Row形式存储数据,并通过RowKind标识不同的更新类型。内容还展示了如何在Flink中将表转换为流以及从流转换回表的过程,包括使用SQL创建视图和执行查询的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

changelogStream

在动态表的概念中,其输出结果不是一个简单的“结果记录”不断追加的状态,而是一个需要对“前序”结果进行修正的状态;为了能向下游传递其输出结果的动态信息,flink 设计了一种 DataStream,叫做changelogStream(改变日志流)

changelogStream 的本质

  • changelogStream 依然是一个 DataStream
  • 与普通 stream 不同的是,changelog 流中的数据类型是 Row
  • 而在 Row 中,有一个属性 RowKind 来标识一行数据属于哪种“更新类型”(+I/-U/+U/-D)

表=>流

在这里插入图片描述
示例

 // 将视图表转Table对象,再转为流
DataStream<Row> dataStream = tenv.toChangelogStream(tenv.from("topn_odd")); 
dataStream.print();

流=>表

在这里插入图片描述
示例

// 1,zs,male,18
DataStreamSource<String> s1 = env.socketTextStream("hdp01", 9999);
SingleOutputStreamOperator<Person> s2 = s1.map(s -> {
    String[] split = s.split(",");
    return new Person(Integer.parseInt(split[0]), split[1], split[2], Integer.parseInt(split[3]));
});

// 把流变成表
tenv.createTemporaryView("tab", s2);     // 注册了sql表名,后续可以用sql语句查询
Table table = tenv.fromDataStream(s2);  // 得到table对象,后续可以用api进行查询

创建视图

// 方式一
Sting sql1 = "select * fron tab";
Table tmp = tenv.sqlQuery(sql1);
tenv.createTemporaryView("tmp", tmp); // Table对象转视图表
tenv.executeSql("select * from tmp where age % 2 = 1").print();
// 方式二
String sql2 = "create temporary view topn_view" +
        "as" +
        "SELECT" +
        "  id," +
        "  name," +
        "  age," +
        "  gender," +
        "  rn" +
        "FROM" +
        "(\n" +
        "select" +
        "   id," +
        "   name," +
        "   age," +
        "   gender," +
        "   row_number() over(partition by gender order by age desc) as rn" +
        "from abc" +
        ") o" +
        "where rn<=3";

tenv.executeSql(sql2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值