普通的业务逻辑是否能改写成 SQL?Flink 能够改写成 FlinkSQL的理论依据是什么?

当关系模型最初被引入时,就包含了查询数据的不同方法:SQL 是一种声明式查询语言,而 IMS 和 CODASYL 则是命令式。这种差别意味着什么呢?

命令式代码 vs 声明式代码

例如,我有一个动物物种的列表,想要查询列表中的鲨鱼:

1、命令式代码:

function getSharks() {var sharks = [];for (var i = 0; i < animals.length; i++) {if (animals[i].family === "Sharks") {sharks.push(animals[i]);}}return sharks;
}

2、声明式代码:

SELECT * FROM animals WHERE family = 'Sharks';

命令式语言 告诉计算机以特定顺序执行某些操作,而对于 声明式的查询语言,则只需要指定所需的数据格式,结果需要满足什么条件,以及如何转换数据(例如,排序、分组和聚合),而不需要指明如何实现这一目标。

命令式代码 由于指定了特定的执行顺序,很难在多核和多台机器上并行化,声明式语言 则对于并行执行更为友好。

例如,对于 Web 浏览器来说,使用声明式 CSS 样式表比用 JavaScript 命令式地操作样式好得多。类似地,在数据库中,像 SQL 这样的声明式查询语言比命令式查询 APIs 要好得多。

MapReduce 查询

MapReduce 是一个相当底层的编程模型,用于在许多机器上批量处理海量数据。

MapReduce 既不是声明式查询语言, 也不是一个完全命令式的查询 API, 而是介于两者之间: 查询的逻辑用代码片段来表示, 这些代码片段可以被处理框架重复地调用。它主要基于许多函数式编程语言中的 map (也称为 collect) 和 reduce (也称为 fold 或inject) 函数。

map 和 reduce 函数对于可执行的操作有所限制。 它们必须是纯函数, 这意味着只能使用传递进去的数据作为输入, 而不能执行额外的数据库查询, 也不能有任何副作用。这些限制 使得数据库能够在任何位置、 以任意顺序来运行函数, 并在失败时重新运行这些函数。 不管怎样, 该功能非常强大, 可以通过它来解析字符串、 调用库函数、 执行计算等。

读者注:这些限制能够让代码在多台机器上并行执行,更贴近 SQL 这样的声明式查询语言。也正是因为这些限制,让 Flink 任务改写为 FlinkSQL 从理论上是可行的。

参考:《数据密集型应用系统设计》,Martin Kleppmann,P53

Flink 能够改写成 FlinkSQL的理论依据:命令式代码 vs 声明式代码相关推荐

  1. tensorflow的mnist改写成pytorch

    最近公司使用算法要用pytorch,所以本人暂时放弃使用tensorflow,为了练手pytorch,本人首先使用pytorch将tensorflow版本的mnist转换成pytorch版本,tens ...

  2. ORACLE NOT EXISTS不等值 改写成hive

    ORACLE NOT EXISTS不等值 改写成hive SELECT A.A1, A.A2,A.A3,A.A4FROM ALEFT JOIN C ON A.A6= C.C6WHERE NOT EXI ...

  3. fopen需要改写成fopen_s的时候

    FILE* pFile=fopen_s(filename,"rb"); 改写成: FILE* pFile; if(fopen_s(&pFile,filename," ...

  4. c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!

    ★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...

  5. mysql left join和or_Case:MySQL使用left join的时候or改写成union可以提高效率

    Case:MySQL使用left join的时候or改写成union可以提高效率 发布时间:2020-07-29 02:29:13 来源:51CTO 阅读:1501 作者:Darren_Chen (1 ...

  6. 贺利坚老师汇编课程37笔记:把六个字符串里的头一个字母改写成大写字母

    指路老师的博客 将datasg段中每个单词的头一个字母改写成大写字母,共六个字符串 像是某个软件的菜单 assume cs:codesg,ds:datasg datasg segmentdb '1. ...

  7. 把下列c语言的语句改写成汇编语言的程序片段,其中变量都为整形变量,汇编程序设计读书笔记(4)...

    第1章 标识符和表达式 1.1 标识符 标识符最多由31个字母.数字及规定的特殊字符(?.@._.$)等组成,但它不能用数字开头.通常情况下,汇编语言不区分标识符中字母的大小写. 1.2 简单内存变量 ...

  8. 【C语言】世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

    世界上不同国家有不同的写日期的习惯.比如美国人习惯写成"月-日-年",而中国人习惯写成"年-月-日".下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯 ...

  9. 中国银河证券公募基金分类体系的理论依据与规则基础

    中国银河证券公募基金分类体系的理论依据与规则基础 银河证券基金研究中心 4天前 基金分类是基金评价的基础.中国银河证券股份有限公司及其基金研究中心作为基金评价机构,一直致力于基金分类体系的建设.中国银 ...

最新文章

  1. jupyter|魔法函数问题| UsageError: Line magic function `%` not found
  2. FusionCharts参数的详细说明
  3. POJ 2253 Frogger(最短路Floyd)题解
  4. 将远程服务器获取的linkedhashMap对象转为实体类对象
  5. **上海铁路局2004年最新时刻发布!**
  6. 对话Justin Uberti:RTC的过去、现在和未来
  7. MFC学习之路之多媒体 --(1) DirectShow
  8. 联通宣布用户存费1300元可获赠21M上网卡
  9. jdk1.6+Maven
  10. 几种常用的显示器分辨率
  11. poj_2945 Find the Clones (Trie树 内存分配)
  12. 胡阳pyhton作业题--20150728
  13. HPE增强长期归档存储 转售SpectraLogic高端磁带库
  14. ctrl+v粘贴快捷键突然不能使用的原因及解决方案
  15. 拓嘉启远电商:拼多多新店多久才有流量
  16. 华中科技大学赛尔宽带登录六维空间
  17. Java:Java静态多态性与动态多态性
  18. 642-825 认证题库
  19. Ping32最新版支持钉邮监控
  20. html-优秀学生信息表格

热门文章

  1. CodeForces - 1267A Apprentice Learning Trajectory(贪心)
  2. HDU - 6514 Monitor(二维差分)
  3. Maximum Subsequence Sum最大子列和问题(c语言实现)
  4. 线段树空间容纳且最上边的数(单点更新)
  5. 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
  6. cocos2d-x初探学习笔记(8)--场景特效
  7. Android端打开HttpDns的正确姿势
  8. C++ 类和对象(一):类的概念、类的访问控制和封装、类对象模型、this指针
  9. 第46讲:遇到动态页面怎么办?详解渲染页面爬取
  10. QUIC 是如何解决TCP 性能瓶颈的?