前言你有想過(guò)在 pandas 中直接使用 sql嗎?我知道許多小伙伴已經(jīng)知道一些庫(kù)也可以做到這種體驗(yàn),,不過(guò)他們的性能太差勁了(基于sqlite,,或其他服務(wù)端數(shù)據(jù)庫(kù))。 今天我要介紹另一個(gè)專用于數(shù)據(jù)分析的列式數(shù)據(jù)庫(kù),,性能是其他同體驗(yàn)的庫(kù)的1000倍以上,。可以無(wú)縫接入 pandas ,,做到了性能與使用體驗(yàn)同時(shí)提升,。 這就是今天的主角,duckdb,。 特點(diǎn)duckdb 是一個(gè)單機(jī)數(shù)據(jù)庫(kù),,你大概率會(huì)用它與 sqlite 比較。 最明顯的區(qū)別就是,,duckdb 是一個(gè)分析數(shù)據(jù)管理系統(tǒng),,而 sqlite 是一個(gè)事務(wù)型關(guān)系數(shù)據(jù)庫(kù),。 這意味著,如果你現(xiàn)在有一大堆數(shù)據(jù)處理任務(wù),,期間無(wú)須顧忌會(huì)有其他用戶插入新數(shù)據(jù)或刪除數(shù)據(jù),。那么 duckdb 就可以非常好應(yīng)對(duì)這種場(chǎng)景,。 對(duì)于我們這種 pandas 老用戶,,duckdb 支持 pandas 的 dataFrame 通用底層格式(parquet/arrow等)上并行運(yùn)行查詢,而且沒(méi)有單獨(dú)的導(dǎo)入步驟,。這就是它能保持使用體驗(yàn)的同時(shí),,大幅提升查詢性能的最大原因。 我們需要安裝這些庫(kù) pip install pandas duckdb -U 先看一個(gè)例子,,看看它是如何便捷與 dataframe 交互,。 變量等于表名?首先,,導(dǎo)入今天需要用到的庫(kù) 我們有一大堆銷售數(shù)據(jù),,加載其中一份數(shù)據(jù)看看: 此時(shí),,希望使用 sql 做一些數(shù)據(jù)查詢處理,,你認(rèn)為下面的 sql 簡(jiǎn)單嗎?
這真的可以做到嗎?加上一點(diǎn)點(diǎn) duckdb 的調(diào)用即可:
也就是,,可以直接使用當(dāng)前環(huán)境下的變量作為表名,。 我知道之前就有其他的庫(kù)可以做到這種體驗(yàn),但是必需強(qiáng)調(diào),,duckdb 是直接使用 dataframe 的內(nèi)存數(shù)據(jù)(因?yàn)榈讓訑?shù)據(jù)格式通用),,因此,這個(gè)過(guò)程中的輸入和輸出數(shù)據(jù)的傳輸時(shí)間幾乎可以忽略不計(jì),。 并且,,這個(gè)過(guò)程中,duckdb比 pandas 更快處理數(shù)據(jù)(多線程),,并且內(nèi)存使用量也比 pandas 要低得多,。 特別在一些需要分組的數(shù)據(jù)處理任務(wù)上,,就算只使用單線程的 duckdb 也會(huì)比 pandas 的快兩倍。如果是過(guò)濾 分組 列投影,,會(huì)存在 5-8倍 的差異,。 如果加上表連接,則可能會(huì)到 15倍 的差異,。 如果使用其他的一些 pandas 使用 sql 的庫(kù),,比如 pandasSql ,它比 duckdb 性能差距 1000倍 以上,!
性能方面,,就'吹'到這里。但是,,我說(shuō) duckdb 有極致的使用體驗(yàn),,不僅僅只是可以直接使用 dataframe 變量名作為表名寫 sql 。而是它提供了許多 sql 引擎沒(méi)有的優(yōu)化語(yǔ)法體驗(yàn),。 sql 的一些語(yǔ)法小痛點(diǎn),,duckdb 也在努力解決現(xiàn)在我們需要加載所有的銷售數(shù)據(jù)文件,如果使用 pandas 加載,,則是這樣子:
duckdb提供了許多方便的內(nèi)置函數(shù):
默認(rèn)情況下,,duckdb 會(huì)把 csv 的第一行也加入到記錄中: 可以使用內(nèi)置函數(shù),,通過(guò)參數(shù)設(shè)定一些加載規(guī)則:
不過(guò),,這個(gè) header 參數(shù)其實(shí)是加載所有數(shù)據(jù)之后,,再設(shè)置第一行為表頭。所以會(huì)看到實(shí)際數(shù)據(jù)仍然有一些表頭行: 我們可以直接在條件過(guò)濾中一步到位過(guò)濾掉無(wú)用的行: 此時(shí),,我們可以隨時(shí)切換使用方式,。 sql 中有一些語(yǔ)句在特定場(chǎng)景下,會(huì)顯得'無(wú)意義',。比如我希望查詢所有的列: 每次都寫一句 select * ,,有點(diǎn)麻煩,。在 duckdb 里面,我們可以直接省略 select 語(yǔ)句,。 有時(shí)候,,我們希望排除某幾列,可以這么寫:
再看幾個(gè)小小的 sql 體驗(yàn)改進(jìn),。 別名用在過(guò)濾條件中: 自動(dòng)識(shí)別分組列名: 它還有許多有意思的特性,,如果希望我后續(xù)做更多的教學(xué),,評(píng)論區(qū)告訴我。 duckdb 是一個(gè)很有潛力的數(shù)據(jù)分析處理工具,,結(jié)合 pandas 能否大幅提升我們的工作效率,,值得大家嘗試使用。 不要忘記一鍵三連,。你的點(diǎn)贊,、收藏、關(guān)注,,是我創(chuàng)作的動(dòng)力,。 |
|
來(lái)自: 昵稱43998645 > 《待分類》