Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

Flink SQL中的操作符 1 操作符 1.1 Show与Use (1) Show(批处理流处理) -- 显示所有 catalog SHOW CATALOGS; -- 显示当前 catalog 中所有的数据库 SHOW DATABASES; -- 显示当前数据库、Catalog中的所有表 SHOW TABLES; (2) Use(批处理流处理) -- 为本次会话设置 catalog USE CATALOG mycatalog; -- 为会话设置一个属于当前 catalog 的数据库 USE mydatabase; 1.2 Sc 阅读详情

一、Flink SQL 背景

Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

 

Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。

自 2015 年开始,阿里巴巴开始调研开源流计算引擎,最终决定基于 Flink 打造新一代计算引擎,针对 Flink 存在的不足进行优化和改进,并且在 2019 年初将最终代码开源,也就是我们熟知的 Blink。Blink 在原来的 Flink 基础上最显著的一个贡献就是 Flink SQL 的实现。

Flink SQL 是面向用户的 API 层,在我们传统的流式计算领域,比如 Storm、Spark Streaming 都会提供一些 Function 或者 Datastream API,用户通过 Java 或 Scala 写业务逻辑,这种方式虽然灵活,但有一些不足,比如具备一定门槛且调优较难,随着版本的不断更新,API 也出现了很多不兼容的地方。

Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

 

在这个背景下,毫无疑问,SQL 就成了我们最佳选择,之所以选择将 SQL 作为核心 API,是因为其具有几个非常重要的特点:

  • SQL 属于设定式语言,用户只要表达清楚需求即可,不需要了解具体做法;
  • SQL 可优化,内置多种查询优化器,这些查询优化器可为 SQL 翻译出最优执行计划;
  • SQL 易于理解,不同行业和领域的人都懂,学习成本较低;
  • SQL 非常稳定,在数据库 30 多年的历史中,SQL 本身变化较少;
  • 流与批的统一,Flink 底层 Runtime 本身就是一个流与批统一的引擎,而 SQL 可以做到 API 层的流与批统一。

二、Flink 的最新特性(1.7.0 和 1.8.0 更新)

2.1 Flink 1.7.0 新特性

在 Flink 1.7.0 中,我们更接近实现快速数据处理和以无缝方式为 Flink 社区构建数据密集型应用程序的目标。最新版本包括一些新功能和改进,例如对 Scala 2.12 的支持、一次性 S3 文件接收器、复杂事件处理与流 SQL 的集成等。

Apache Flink 中对 Scala 2.12 的支持(FLINK-7811)

Apache Flink 1.7.0 是第一个完全支持 Scala 2.12 的版本。这允许用户使用较新的 Scala 版本编写 Flink 应用程序并利用 Scala 2.12 生态系统。

状态演进(FLINK-9376)

许多情况下,由于需求的变化,长期运行的 Flink 应用程序需要在其生命周期内发展。在不失去当前应用程序进度状态的情况下更改用户状态是应用程序发展的关键要求。使用 Flink 1.7.0,社区添加了状态演变,允许您灵活地调整长时间运行的应用程序的用户状态模式,同时保持与以前保存点的兼容性。通过状态演变,可以在状态模式中添加或删除列,以便更改应用程序部署后应用程序捕获的业务功能。现在,使用 Avro 生成时,状态模式演变现在可以立即使用作为用户状态的类,这意味着可以根据 Avro 的规范来演变国家的架构。虽然 Avro 类型是 Flink 1.7 中唯一支持模式演变的内置类型,但社区仍在继续致力于在未来的 Flink 版本中进一步扩展对其他类型的支持。

MATCH RECOGNIZE Streaming SQL 支持(FLINK-6935)

这是 Apache Flink 1.7.0 的一个重要补充,它为 Flink SQL 提供了 MATCH RECOGNIZE 标准的初始支持。此功能结合了复杂事件处理(CEP)和 SQL,可以轻松地对数据流进行模式匹配,从而实现一整套新的用例。此功能目前处于测试阶段,因此我们欢迎社区提供任何反馈和建议。

流式 SQL 中的时态表和时间连接(FLINK-9712)

时态表是 Apache Flink 中的一个新概念,它为表的更改历史提供(参数化)视图,并在特定时间点返回表的内容。例如,我们可以使用具有历史货币汇率的表格。随着时间的推移,这种表格不断增长/发展,并且增加了新的更新汇率。时态表是一种视图,可以将这些汇率的实际状态返回到任何给定的时间点。使用这样的表,可以使用正确的汇率将不同货币的订单流转换为通用货币。时间联接允许使用不断变化/更新的表来进行内存和计算有效的流数据连接。

Streaming SQL 的其他功能

除了上面提到的主要功能外,Flink 的 Table&SQL API 已经扩展到更多用例。以下内置函数被添加到 API:TO_BASE64、LOG2、LTRIM、REPEAT、REPLACE、COSH、SINH、TANH SQL Client 现在支持在环境文件和 CLI 会话中定义视图。此外,CLI 中添加了基本的 SQL 语句自动完成功能。社区添加了一个 Elasticsearch 6 表接收器,允许存储动态表的更新结果。

Kafka 2.0 连接器(FLINK-10598)

Apache Flink 1.7.0 继续添加更多连接器,使其更容易与更多外部系统进行交互。在此版本中,社区添加了 Kafka 2.0 连接器,该连接器允许通过一次性保证读取和写入 Kafka 2.0。

本地恢复(FLINK-9635)

Apache Flink 1.7.0 通过扩展 Flink 的调度来完成本地恢复功能,以便在恢复时考虑以前的部署位置。如果启用了本地恢复,Flink 将保留最新检查点的本地副本任务运行的机器。通过将任务调度到以前的位置,Flink 将通过从本地磁盘读取检查点状态来最小化恢复状态的网络流量。此功能大大提高了恢复速度。

2.2 Flink 1.8.0 新特性

Flink 1.8.0 引入对状态的清理

使用 TTL(生存时间)连续增量清除旧的 Key 状态 Flink 1.8 引入了对 RocksDB 状态后端(FLINK-10471)和堆状态后端(FLINK-10473)的旧数据的连续清理。这意味着旧的数据将(根据 TTL 设置)不断被清理掉。

新增和删除一些 Table API

1) 引入新的 CSV 格式符(FLINK-9964)

此版本为符合 RFC4180 的 CSV 文件引入了新的格式符。新描述符可以使用 org.apache.flink.table.descriptors.Csv。目前,只能与 Kafka 一起使用。旧描述符 org.apache.flink.table.descriptors.OldCsv 用于文件系统连接器。

2) 静态生成器方法在 TableEnvironment(FLINK-11445)上的弃用

为了将 API 与实际实现分开,TableEnvironment.getTableEnvironment() 不推荐使用静态方法。现在推荐使用 Batch/StreamTableEnvironment.create()。

3) 表 API Maven 模块中的更改(FLINK-11064)

之前具有 flink-table 依赖关系的用户需要更新其依赖关系 flink-table-planner,以及正确的依赖关系 flink-table-api-*,具体取决于是使用 Java 还是 Scala: flink-table-api-java-bridge 或者 flink-table-api-scala-bridge。

Kafka Connector 的修改

引入可直接访问 ConsumerRecord 的新 KafkaDeserializationSchema(FLINK-8354),对于 FlinkKafkaConsumers 推出了一个新的 KafkaDeserializationSchema,可以直接访问 KafkaConsumerRecord。

三、Flink SQL 的编程模型

Flink 的编程模型基础构建模块是流(streams)与转换 (transformations),每一个数据流起始于一个或多个 source,并终止于一个或多个 sink。

Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

 

相信大家对上面的图已经十分熟悉了,当然基于 Flink SQL 编写的 Flink 程序也离不开读取原始数据,计算逻辑和写入计算结果数据三部分。

一个完整的 Flink SQL 编写的程序包括如下三部分:

Source Operator:Soruce operator 是对外部数据源的抽象, 目前 Apache Flink 内置了很多常用的数据源实现例如 MySQL、Kafka 等;

Transformation Operators:算子操作主要完成例如查询、聚合操作等,目前 Flink SQL 支持了 Union、Join、Projection、Difference、Intersection 及 window 等大多数传统数据库支持的操作;

Sink Operator:Sink operator 是对外结果表的抽象,目前 Apache Flink 也内置了很多常用的结果表的抽象,比如 Kafka Sink 等

我们通过用一个最经典的 WordCount 程序作为入门,看一下传统的基于 DataSet/DataStream API 开发和基于 SQL 开发有哪些不同?

DataStream/DataSetAPI

Flink SQL

//省略掉初始化环境等公共代码
SELECT word, COUNT(word) FROM table GROUP BY word;

我们已经可以直观体会到,SQL 开发的快捷和便利性了

Flink SQL代码示例(scala版本) 一、创建SBT项目,添加以下依赖// https://mvnrepository.com/artifact/org.apache.flink/flink-table libraryDependencies += "org.apache.flink" %% "flink-table" % "1.2.0" // https://mvnrepository.com/artifact/org.apache... 阅读详情

相关推荐

FlinkSQL 列转行/解开map array/unnest/lateral table udtf

将Map展开为多列多行。 基于UDTF 结果示例 2 将数组展开为单列多行。 基于UNNEST 基于UDTF 结果示例 3 将Array展开成多列多行 end

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 8335

FlinK运行一段时间后任务任务自己挂掉的问题排查

近在做自定义实时报表,由于在前期测试Flink发现Flink拥有比较好的性能,并且天然支持窗口,所以在实时计算的时候,我们选择Flink在做计算框架.在所有的代码完成,代码准备上线的时候,发现Flink程序运行一段时间后,要么自己直接挂掉要么过一段时间,程序从checkpoint恢复.在排查日志的过程中,程序中并没有什么异常报出,终排查每个taskManager的日志发现在其中一个TaskMa...

梦想成真那天 1万+

flinksql下的时间日期格式转换

flinksql里面常用的事情就是时间格式转换,比如各种时间格式转换成TIMESTAMP(3).

科学的N次方 1万+

Flink SQL 入门实战

文章目录一.Flink SQL 背景二、Flink SQL Hello_world三、Flink SQL 的语法算子3.1 Flink SQL 的语法3.1 常用算子3.1.1 滚动窗口语法3.1.2滑动窗口3.1.3 Session Window 一.Flink SQL 背景 Flink SQLFlink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。 自 2015 年开始,阿里巴巴开始调研开源流计算引擎,终决定基于 Flink 打造新一代计算

小梁 1013

FlinkSql常用函数

1、比较函数 = <> > >= < <= 注意:select null=null; 返回为null IS NULL 、 IS NOT NULL --非空判断 value1 IS DISTINCT FROM value2、value1 IS NOT DISTINCT FROM value2、 --不同于 value1 BETWEEN [ ASYMMETRIC | SYMMETR

qq_45003354的博客 1万+

Flink运行一段时间后挂掉

备注:我们Flink 使用的是1.4.0的版本. 所以我们为了稳定,放弃了使用RockDbStateBackEnd改用FsStatebackEnd程序目前没有报出内存泄露的问题.运行良好.

weixin_59295776的博客 608

FlinkSQL学习笔记(一)快速入门

FlinkSQL是架构于 flink core 之上用 sql 语义方便快捷地进行结构化数据处理的上层库;(非常类似 sparksql sparkcore 的关系)由于FlinkSQL建立在Flink core的基础之上,这里进行先对一个简单的FlinkSQL编程过程进行说明。FlinkSQL编程包括TableAPISQLAPI,运用中更多地使用SQLAPI,这里对于TableAPI不做详细介绍,后续用到的时候再进行详细介绍。此外,在编程方式上,两种SQL可以进行混合使用。

weixin_37172178的博客 3109

flinkSQL 建表设置水位线时间格式转换 & flinkSQl滚动窗口

flinkSQL 建表设置水位线时间格式转换 & flinkSQl滚动窗口

weixin_45408791的博客 1419

flink-sql所有数据类型-1.15

本文是对 flink 1.15 官网中 flink sql 数据类型部分的翻译整理。

第一片心意的博客 4801

FLINK SQL 时间戳转换

1.TO_TIMESTAMP时间戳类型转换问题 上图是来自阿里巴巴FlinkSQL开发手册,案例中TO_TIMESTAMP可以将13位bigint类型的UNIX时间戳 转换成 TIMESTAMP的日期类型2017-09-15T00:00这种形式。 实际操作过程中会出现报错: Flink SQL> select TO_TIMESTAMP(1513135677000); [ERROR] Could not execute SQL statement. Reason: org.apach...

qq_43193797的博客 2万+

flink1.10三节点集群standalone模式搭建

各台机器上提前准备jdk1.8以及上的java环境,并且配置ssh免密登录。 集群环境 flink1:172.21.89.128 jobmanager flink2:172.21.89.129 taskmanager flink3:172.21.89.130 taskmanager 在flink1上做flink配置,主要是flink-conf.yaml、mastersslaves flink-conf.yaml: jobmanager.rpc.address: fl

ASN_forever的博客 3539

直播平台源码,FlinkSQL实现行转列

将 0 个、1 个或多个标量值作为输入参数(可以是变长参数)。与自定义的标量函数类似,但与标量函数不同。表值函数可以返回任意数量的行作为输出,而不仅是 1 个值。自定义 UDTF 解析的时候,就不需要把 list 字段定义成 ARRAY 类型了,直接定义成 STRING 类型就可以了,并且这种方式会更加的灵活,比如还需要过滤数据或者更复杂的一些操作时都可以在 UDTF 里面完成.以上就是 直播平台源码,FlinkSQL实现行转列,更多内容欢迎关注之后的文章。UDTF(自定义表值函数),自定义表值函数。

云豹网络科技 692

Flink基础(二十):Table API Flink SQL(五)

Flink Table SQL内置了很多SQL中支持的函数;如果有无法满足的需要,则可以实现用户自定义的函数(UDF)来解决。 1 系统内置函数 Flink Table API SQL为用户提供了一组用于数据转换的内置函数。SQL中支持的很多函数,Table APISQL都已经做了实现,其它还在快速开发扩展中。 以下是一些典型函数的举例,全部的内置函数,可以参考官网介绍。 比较函数 SQL: value1 = value2 value1 > value2 Table API:

czl689的专栏 340

数据分析小结:使用流计算 Oceanus(Flink) SQL 作业进行数据类型转换

作者:吴云涛,腾讯 CSIG 高级工程师 在这个数据爆炸的时代,企业做数据分析也面临着新的挑战, 如何能够更高效地做数据准备,从而缩短整个数据分析的周期,让数据更有时效性,增加数据的价...

cloudbigdata的博客 4844

Flink Table Api 之table结果查询与过滤

Flink Table Api 之table结果查询与过滤

congge_study的博客 7681

flink sql运用入门

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 目前我司项目中有实时大屏的需求,涉及实时计算部分的选型(以开源为基础),目前主流选择有spark,stormflink。其中storm只...

yc_zlj的博客 4653

FlinkSQL系列08-自定义函数

典型的标量函数如:upper(str), lower(str), abs(salary)特点:对输入的数据行(一组)进行持续的聚合,终对每组数据输出一行或多行(多列)结果。特点:对输入的数据行(一组)进行持续的聚合,终对每组数据输出一行(多列)结果。特点:运行时每接收一行数据(一个或多个字段),能产出多行、 多列的结果。特点:每次只接收一行的数据,输出结果也是 1 行 1 列。典型的如:explode( ), unnest ( )典型的如:sum( ), max( )...

边看边学 1366

Flink SQL UNNEST/UDTF 如何实现列转行?

SQL 任务里面经常会遇到一列转多行的需求,今天就来总结一下在 Flink SQL 里面如何实现列转行的,先来看下面的一个具体案例. 需求: 原始数据格式如下 name data JasonLee [{"content_type":"flink","url":"111"},{"content_type":"spark","url":"222"},{"content_t...

微信公众号:大数据从业者 1577
上一篇: Zdal分库分表:支付宝是如何在分布式环境下完爆数据库压力的?
下一篇: 分享:Python绘制六种常见可视化图表,总有一款类型适合你的风格
爱玛士
博客等级 码龄6年 719粉丝 253原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值