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

本文探讨了SQL声明式查询语言与命令式编程的区别,指出声明式语言在并行处理上的优势。以Flink为例,由于其查询逻辑的限制,理论上可以将Flink任务改写为FlinkSQL,从而更好地利用并行计算资源。MapReduce作为一种中间状态的编程模型,结合了声明式和命令式的特点,但其纯函数限制有利于并行执行,类似于SQL的特性。
摘要由CSDN通过智能技术生成

普通的业务逻辑是否能改写成 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值