實時分析需要SQL和復(fù)雜查詢
?今天的數(shù)據(jù)驅(qū)動型企業(yè)不僅需要針對實時數(shù)據(jù)作出快速響應(yīng)要,而且還必須執(zhí)行復(fù)雜的查詢以解決復(fù)雜的業(yè)務(wù)問題。
例如,客戶個性化系統(tǒng)需要將歷史數(shù)據(jù)集與實時數(shù)據(jù)流結(jié)合起來,以便立即向客戶提供最相關(guān)的產(chǎn)品建議。提供關(guān)鍵任務(wù)的實時業(yè)務(wù)觀察能力的運營分析系統(tǒng)也必須如此,例如,在線支付供應(yīng)商需要監(jiān)測其全球范圍內(nèi)的交易,以發(fā)現(xiàn)可能預(yù)示金融欺詐的異常情況。
或者想象一個網(wǎng)上學習平臺需要為學區(qū)客戶和內(nèi)部客戶團隊提供關(guān)于學生和教師使用情況的最新洞察力?;蛘呤且粋€市場新聞供應(yīng)商,需要監(jiān)測并確保其金融客戶在狹窄的窗口內(nèi)獲得準確的、相關(guān)的更新,以實現(xiàn)盈利的交易。
NoSQL的局限性
SQL支持復(fù)雜的查詢,因為它是一種非常具有表現(xiàn)力的。 是成熟的語言。復(fù)雜的SQL查詢在商業(yè)智能(BI)中早已司空見慣。而當Hadoop和Hive這樣的系統(tǒng)出現(xiàn)時,它首次將復(fù)雜的查詢與大數(shù)據(jù)結(jié)合起來。Hive在Hadoop的本地MapReduce編程范式上實現(xiàn)了一個SQL層。這些第一代基于SQL的大數(shù)據(jù)系統(tǒng)的代價是,它們以更高的查詢延遲為代價,提高了數(shù)據(jù)處理的吞吐量。因此,這些使用案例仍然是運行在批處理模式中。
當NoSQL數(shù)據(jù)庫(如鍵值和文檔存儲)出現(xiàn)時,情況發(fā)生了變化。設(shè)計目標是低延遲和規(guī)?!,F(xiàn)在,公司可以把一個龐大的數(shù)據(jù)集,組織成簡單的鍵值或文檔對,并立即執(zhí)行查找和其他簡單的查詢。這些大規(guī)模、可擴展的鍵值存儲或文檔數(shù)據(jù)庫的設(shè)計者決定,只有當查詢性質(zhì)簡單時,規(guī)模和速度才有可能。在鍵值存儲中查找一個值,可以做到快如閃電。相比之下,SQL查詢,由于過濾器、排序和聚合的固有復(fù)雜性,在技術(shù)上太有挑戰(zhàn)性,無法在大量數(shù)據(jù)上快速執(zhí)行。
不要注意那個幕后的人
不幸的是,由于上述原因,當查詢復(fù)雜、嵌套且必須返回精確答案時,NoSQL數(shù)據(jù)庫往往會遇到問題。這故意不是他們的強項。他們的查詢語言,無論是類似SQL的變體,如 CQL (Cassandra)和Druid SQL等類似SQL的變體,還是MQL(MongoDB)等完全自定義的語言,都不支持連接和其他復(fù)雜的查詢命令。
NoSQL數(shù)據(jù)庫的供應(yīng)商就像綠野仙蹤一樣,用煙霧和鏡子分散你的注意力,高談闊論狹義的速度定義,這樣你就不會注意到NoSQL數(shù)據(jù)庫在實時分析方面的實際弱點。使用NoSQL數(shù)據(jù)庫的開發(fā)人員最終被迫將Join和其他數(shù)據(jù)邏輯嵌入到他們自己的應(yīng)用程序代碼中--從單獨的表中獲取數(shù)據(jù)到進行連接優(yōu)化和其他分析工作的一切。
雖然走NoSQL的道路是可能的,但它是繁瑣和緩慢的。以一個申請抵押貸款的人為例。為了分析他們的信用度,你會創(chuàng)建一個數(shù)據(jù)應(yīng)用來計算數(shù)據(jù),比如這個人的信用歷史、未償貸款和還款歷史。要做到這一點,你需要結(jié)合幾個數(shù)據(jù)表格,其中一些可能是歸一化的,哪些數(shù)據(jù)是真實的,哪些是不真實的。你還可能分析當前和歷史上的抵押貸款利率,以確定提供什么利率。
使用SQL,你可以簡單地將信用記錄和貸款支付表連接在一起,并聚合大規(guī)模的歷史數(shù)據(jù)集,如每日抵押貸款利率。然而,使用像Python或Java這樣的東西來手動重新創(chuàng)建連接和聚合,與SQL相比,你的應(yīng)用程序中的代碼行數(shù)會增加幾十甚至一百。
更多的應(yīng)用程序代碼不僅需要更多的時間來創(chuàng)建,而且?guī)缀蹩偸菍?dǎo)致更慢的查詢。如果不能使用基于SQL的查詢優(yōu)化器,加速查詢是很困難和費時的,因為應(yīng)用程序中的業(yè)務(wù)邏輯和應(yīng)用程序使用的基于查詢的數(shù)據(jù)訪問路徑之間沒有分界。像一個普通的東西 join table一樣的東西,SQL可以有效而優(yōu)雅地處理,但在其他語言中卻可能成為一個臃腫的內(nèi)存占用者。
最后,用應(yīng)用程序代碼編寫的查詢也是比較脆弱的,需要不斷的維護和測試,如果數(shù)據(jù)量發(fā)生變化,還可能需要重寫。而大多數(shù)開發(fā)人員缺乏時間和專業(yè)知識來進行這種持續(xù)的維護。
只有一個NoSQL系統(tǒng)我認為可以合理地勝任復(fù)雜的查詢。GraphQL。GraphQL系統(tǒng)可以將數(shù)據(jù)類型與特定的數(shù)據(jù)字段聯(lián)系起來,并提供函數(shù)來檢索文檔的選定字段。它的查詢API支持復(fù)雜的操作,例如根據(jù)一組匹配字段過濾文檔,并有選擇地從匹配的文檔中返回字段的子集。GraphQL的主要分析缺陷是它缺乏表達能力,無法根據(jù)兩個不同的數(shù)據(jù)集中特定字段的值來連接這兩個數(shù)據(jù)集。大多數(shù)分析性查詢需要這種能力,以便在查詢時連接多個數(shù)據(jù)源。
為工作選擇最佳工具--SQL
在技術(shù)和生活中,每項工作都有一個為其設(shè)計的最佳工具。對于復(fù)雜的分析查詢,SQL無疑是最好的工具。SQL擁有半個世紀以來開發(fā)的豐富的強大命令集。創(chuàng)建查詢很容易,調(diào)整和優(yōu)化查詢更容易,以加快結(jié)果,縮小中間表,降低查詢成本。
有一些關(guān)于SQL數(shù)據(jù)庫的神話,但它們是基于1990年代的傳統(tǒng)關(guān)系型系統(tǒng)。事實是,現(xiàn)代云原生SQL數(shù)據(jù)庫支持實時分析所有必要的關(guān)鍵功能,包括。
- 可變數(shù)據(jù),以實現(xiàn)令人難以置信的快速數(shù)據(jù)攝取和對晚到事件的順利處理。
- 靈活的模式Schema,可以根據(jù)傳入的流媒體數(shù)據(jù)的結(jié)構(gòu)自動調(diào)整。
- 即時擴大數(shù)據(jù)寫入或查詢的規(guī)模,以處理突發(fā)的數(shù)據(jù)。
SQL仍然非常流行,在所有編程語言中排名最靠前。正如我們所看到的,它支持復(fù)雜的查詢,這是現(xiàn)代實時數(shù)據(jù)分析的一個要求。相比之下,NoSQL數(shù)據(jù)庫在執(zhí)行連接和其他復(fù)雜的查詢命令方面比較弱。此外,尋找一個不太知名的自定義查詢語言的專家可能會很費時和昂貴。
底線是,你將沒有問題找到熟練的數(shù)據(jù)工程師和數(shù)據(jù)運營人員,他們知道SQL及其復(fù)雜查詢的能力。他們將能夠利用這些知識和能力,推動你的組織從批量分析到實時分析的飛躍。?