DuckDB 和 esProc SPL 都支持多樣數據源處理,這里比較一下兩者的差異。
支持的數據源種類
DuckDB 支持的數據源類型覆蓋了常見的文件格式(如 CSV、Parquet、JSON、Excel)、云存儲(如 AWS S3、Azure Blob Storage)以及關系型數據庫(如 MySQL、PostgreSQL、SQLite),也可以通過 httpfs 訪問 web 數據。此外,DuckDB 還支持一些新興的數據湖格式(如 Delta Lake、Iceberg)。
esProc 支持的數據源類型更豐富,涵蓋了更多的本地文件、數據庫和遠程數據源。以下是 SPL 支持的一些數據源:
-
本地文件:CSV、Excel、JSON、XML、Parquet、ORC 等
-
所有關系型數據庫:MySQL、PostgreSQL、Oracle、SQL Server 等(通過 JDBC)
-
NoSQL 數據庫:MongoDB、Cassandra、Redis 等
-
云存儲:HDFS、AWS S3、GCS 等
-
遠程數據源:RESTful API、WebService、FTP/SFTP 等
-
其他:Kafka、ElasticSearch 等
從表面的數量上看,esProc 支持的數據源種類更多,尤其是在非關系型數據庫(如 MongoDB、Redis)和 Kafka、ES 等支持方面,esProc 優勢明顯。
從更深層看,DuckDB 的數據源接入依賴專用連接器(Connector),要針對每種數據源單獨開發,復雜度很高,用戶自行基于開源代碼再開發的難度也很大。結果就是可用 Connector 數量明顯不多,連最常見的關系數據庫也支持的不足,目前能支持 MySQL、PG、SQLite 而不支持 Oracle、MSSQL 等其他常見數據庫,這會導致常見的多數據源混合查詢困難。比如要做 MySQL 和 Oracle 的混合計算,在沒有合適 Connector 時,就只能通過 Python 曲線救國。
esProc 使用數據源 Native 接口,所有關系庫都可以用 JDBC 連接,能天然支持,而其他諸如 MongoDB、Kafka 等數據源也都是基于 Native 接口做簡單封裝即可,開發速度很高,因而提供了更豐富的 Connetor 庫。用戶自己擴展也不難,可以通過預留的擴展接口實現。
有了這些豐富的支持和數據源擴展能力,使用 esProc 完成多數據源混合計算就非常容易了,MySQL+Oracle 直接算就可以,有不支持的數據源擴展起來也簡單。
DuckDB 的專用 Connector 和 esProc 使用 Native 接口簡單封裝沒有好壞之分,前者可以做更深層次的支持和優化,可以做到一定程度的透明化;后者則更加靈活,支持的數據源豐富且擴展靈活,具體傾向于哪個就取決于實際需要了。
數據類型處理
DuckDB 對 CSV 和 Parquet 文件的支持非常成熟,能夠高效讀取和查詢這些文件。例如,DuckDB 可以直接加載 CSV 文件并進行 SQL 查詢,操作簡單直接:
SELECT * FROM 'data.csv' WHERE column_a > 100;
esProc 用 SPL 語法處理 CSV 文件也簡單:
T("data.csv").select(column_a > 100)
除了 SPL 語法,esProc 也同時提供了 SQL 語法:
$SELECT * FROM data.csv WHERE column_a > 100;
簡單情況用 SQL 查,復雜情況用 SPL,二者還可以混用。
由于 SQL 語言的限制,很多復雜計算并不好實現,DuckDB 與 Python 做了很好集成,可以通過 Python 輔助實現復雜需求,但兩個體系編寫調試都不一樣,會產生很強的割裂感。esProc 提供 SQL 和更強大的 SPL,SQL 搞不定的運算用 SPL 就都能實現了,通常還更簡單,一個體系內完成整體性更強一些。
另外一個比較大的差異在 JSON 處理上,esProc 能更好應對復雜計算以及需要保持 JSON 層次結構的場景。完成多層結構計算時,SPL 可以直接用點(.)取子層級數據,很直觀,不需要像 DuckDB 依靠 UNNEST 逐層展開或者嵌套查詢來保持數據結構的完整性,多層數據計算支持的非常徹底。
SPL 多層多條件數據過濾:
json(file("orders.json").read()). select(order_details.product.category=="Electronics" && order_details.sum(price*quantity)>200)
相比 DuckDB,esProc 的數據源支持更加豐富,擴展起來也容易,可以完成絕大部分數據源間的混合計算。數據處理上,esProc 除了 SQL 語法還有 SPL,能應對更多復雜情況,一個體系就能搞定,不存在 SQL 和 Python 兩個體系的割裂,尤其對 JSON 類多層數據的處理,SPL 更簡單直觀。
免費下載