官术网_书友最值得收藏!

1.2 大數據為什么選用SQL

隨著大數據生態的興起和不斷完善,我們已經能夠有效地應對海量數據的存儲和分析需求。這些數據不僅包括企業或用戶在生產和經營過程中產生的結構化數據,還包括大量的音視頻等非結構化數據。盡管非結構化數據分析相較于核心業務數據分析看似是錦上添花,但它并非孤立存在,其分析過程通常伴隨著大量結構化數據的處理。例如在采集短視頻時,我們通常還會收集到與之相關的結構化信息,包括短視頻的作者、發布時間、標簽和時長等。此外,一些非結構化數據在經過處理后,也可以轉化為結構化數據。例如,我們可以從瀏覽網頁的日志中提取出用戶的IP地址、訪問時間、搜索關鍵詞以及瀏覽頁面的詳細信息等。

所謂的非結構化數據分析,實際上往往是針對伴隨而來的結構化數據進行的。事實上,結構化數據分析仍然是大數據生態中的核心。相對而言,結構化數據處理技術更為成熟,例如我們常用的基于關系模型的關系型數據庫。由于關系型數據庫的廣泛應用,數據分析師和數據開發人員對SQL非常熟悉,甚至我們的思維方式也習慣于SQL的邏輯。SQL在執行常規查詢時相對簡單,盡管它在處理復雜的過程計算或順序運算時可能不太方便,但其他替代技術在這方面的表現也并不優越,在面對SQL難以表達的運算時,我們也不得不編寫與UDF(User Defined Function,用戶自定義函數)有同等復雜度的代碼以達到目的。鑒于SQL具有標準化、上手難度低、移植成本低等特性或優點,大數據SQL應運而生。

1.2.1 標準化語言

SQL自1974年發布至今,經歷了一系列的演變和變革,如今整個SQL標準體系日趨成熟。盡管不同的數據庫產品之間存在一些差異,但是SQL的基本結構和語法在大多數關系型數據庫中都是通用的。這意味著一旦用戶掌握了SQL的基本語法和特性,便可以在不同的數據庫系統中進行數據查詢等操作,而無須重新學習新的語言或工具。

圖1-1列舉了SQL-92中的關鍵字,無論是關系型數據庫還是大數據引擎,無論是Oracle、MySQL還是Spark、Flink,這些命令或者關鍵字所代表的含義都是一樣的。

標準化的好處在于確保了SQL查詢等操作在不同數據庫系統之間具有一定的兼容性。這意味著用戶只需編寫一次SQL代碼,便能夠在各種不同的數據庫系統中執行,而無須做出大量修改。這種跨平臺的兼容性賦予了開發人員更大的靈活性,使我們能夠根據需求選擇最合適的數據庫系統。同時,這也提升了學習SQL的價值,因為它的應用范圍覆蓋了眾多數據庫系統。一旦用戶掌握了SQL的基礎語法和原則,便能在不同的數據庫環境中開展工作,無須為每種環境重新學習特定的查詢語言或工具。SQL的標準化不僅加快了數據庫應用程序的編寫和維護速度,而且允許開發人員使用統一的SQL語句來執行數據檢索、插入、更新和刪除等操作,無須關注不同數據庫間的細微差異。得益于SQL標準所確立的數據庫操作的一致性和可預測性,SQL任務的錯誤和風險也得以降低。

圖1-1 SQL-92中的關鍵字

1.2.2 聲明式編程

SQL是聲明式語言的典范,與我們所熟知的常規編程語言相比,SQL更強調“做什么”操作,即用戶需要執行何種查詢或數據操作,而無須詳細說明如何執行這些操作。舉個例子,假如我們有一個用戶列表,需要查找手機號開頭為“155”的用戶。如果使用Python實現,那么可以按照以下方式編寫代碼。

這是一種命令式的方法,即提供達成目標的每一步指令并逐步執行。隨著語言和框架的增多和不斷演進,每種技術(這里指編程語言)的功能開始出現重疊,為完成相同的任務提供了眾多不同的選項。例如,如果使用Java來實現上述需求,我們會采用以下方法。

如果用Scala實現,則是如下所示方法。

總之,現代編程語言和框架為開發者提供了豐富的工具和技術,允許我們能夠以更高層次的抽象解決問題。然而,這也意味著新用戶接入和迭代的難度大幅增加。此外,在跨業務模塊、跨平臺或系統時,可移植性也將受到很大挑戰。如果我們采用SQL來實現上述需求,可能會這樣編寫代碼。

這恰恰體現了聲明式語言的核心理念—直接描述目標。不同于命令式編程的“怎么做”,聲明式編程關注的是“要做什么”,它只描述期望達到的結果,而不涉及具體的執行步驟。聲明式方法的高度抽象使用戶能夠專注于目標本身,而無須擔心實現的具體細節。這種方法對用戶更加友好,因為它減少了用戶需要考慮的細節。更重要的是,聲明式語言支持多種底層實現策略,這意味著在不改變目標的前提下,可以不斷地對實現方式進行優化。例如,在前面提到的SQL案例中,我們可以通過遍歷所有用戶數據來實現目標,也可以利用索引來提高查詢效率。

SQL的聲明式性質使用戶可以專注于表達想要的結果,而不必關心底層的實現細節。這對于處理大數據集和復雜查詢非常重要,因為用戶可以使用高層次的語言來操作數據,而不需要關注底層的分布式計算和處理邏輯。大數據引擎(如Hadoop、Spark等)可以根據用戶的SQL自動進行查詢優化和執行計劃的生成。引擎會根據數據分布、集群資源等因素自動選擇最優執行路徑,將底層的優化工作留給引擎自己處理。聲明式語言的特性使得它們可以應用于大數據處理領域,如分布式計算和大數據分析。這允許開發人員在不需要詳細了解底層分布式架構的情況下,使用高級查詢來處理大量數據。聲明式語言所表達的“把方便留給用戶,把麻煩留給自己”的哲學,結合SQL標準化的定義,使得SQL在大數據體系中得以大放異彩。

1.2.3 借鑒關系數據庫成熟理論

盡管大數據生態在理念上與傳統的關系型數據庫存在顯著差異,但它仍然能夠借鑒關系型數據庫及其關系模型的成熟理論和行業實踐。例如,在大數據處理中廣為人知的連接操作(JOIN),盡管需要考慮到分布式計算等特有的技術特性,但核心的實現算法依然是哈希連接、排序合并連接(參見圖1-2)和循環嵌套連接。這些算法都源自關系型數據庫的技術體系。

我們所關注并強調的SQL引擎優化,包括語法解析、基于規則的優化(RBO)、基于代價的優化(CBO)以及列式存儲等,這些都是源自傳統數據庫技術的成熟實踐。

傳統關系型數據庫的核心優勢在于其久經考驗的SQL優化器經驗,但在可用性、容錯性和可擴展性方面則略顯不足,而大數據生態的技術優勢在于其天然的可擴展性、可用性和容錯性,但在SQL優化方面,幾乎全部借鑒傳統關系型數據庫的經驗。兩者相互融合、相互借鑒,在不同數據處理場景中最大限度地發揮優勢,以滿足多樣化的業務需求。

圖1-2 Spark排序合并連接原理

主站蜘蛛池模板: 南昌县| 佛冈县| 辉南县| 和田市| 长白| 视频| 镇原县| 澎湖县| 汉中市| 石棉县| 十堰市| 宝清县| 延庆县| 桑植县| 前郭尔| 西昌市| 黎川县| 喀喇| 泉州市| 临夏市| 闽清县| 济源市| 莱芜市| 儋州市| 鄂伦春自治旗| 盐城市| 麦盖提县| 曲水县| 衢州市| 马鞍山市| 炎陵县| 从江县| 西和县| 石景山区| 闽清县| 凌源市| 循化| 桃江县| 安阳县| 宁乡县| 公安县|