Flink 能够改写成 FlinkSQL的理论依据:命令式代码 vs 声明式代码
普通的業務邏輯是否能改寫成 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 声明式代码的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: leetcode 785. Is Gra
- 下一篇: 从另一个角度理解分布式系统与CAP定理
