作者:來自 Elastic?Jeffrey Rengifo
學習如何將 ES|QL 與 JavaScript 的 Apache Arrow 客戶端工具一起使用。
想獲得 Elastic 認證嗎?了解下一期 Elasticsearch Engineer 培訓的時間吧!
Elasticsearch 擁有眾多新功能,助你為自己的使用場景構建最佳搜索解決方案。深入了解我們的示例筆記本,開始免費的云試用,或立即在本地機器上體驗 Elastic。
Elasticsearch 查詢語言(ES|QL)是一種基于管道的新指令語言,旨在讓用戶以逐步的方式連接不同的操作。它是一種為數據分析優化的語言,并在一套新架構中運行,能夠高效分析海量數據。
你可以在這篇文章和文檔中進一步了解 ES|QL。
ES|QL 查詢支持構建多種格式的響應,例如 JSON、CSV、TSV、YAML、Arrow 和 binary。從 Elasticsearch 8.16 開始,Node.js 客戶端中包含了一些處理這些格式的工具。
本文將介紹最新的工具: toArrowReader 和 toArrowTable,它們在 Elasticsearch Node.js 客戶端中專門支持 Apache Arrow。更多關于工具的內容,請查看這篇文章。
什么是 Apache Arrow?
Apache Arrow 是一種列式數據分析工具,使用與現代環境中各種編程語言無關的通用格式。
Arrow 格式的主要優點之一是其二進制列式結構經過優化,可實現非常快速的讀取,從而支持高性能的分析計算。

閱讀這篇文章,了解如何在 ES|QL 中利用 Arrow。
ES|QL Apache Arrow 工具
在示例中,我們將使用 Elastic 的 Web 日志示例數據集。你可以按照這份文檔將其導入。
Elasticsearch 客戶端
通過指定你的 Elasticsearch 端點 URL 和 API Key 來配置 Elasticsearch 客戶端。
const { Client } = require("@elastic/elasticsearch");const esClient = new Client({node: "ELASTICSEARCH_ENDPOINT",auth: { apiKey: "ELASTICSEARCH_API_KEY" },
});
toArrowReader
toArrowReader 工具用于優化內存使用,它不會一次性將整個結果集加載到內存中,而是以批次方式進行流式處理。這使得可以在不耗盡系統內存的情況下,對超大數據集執行計算。
這個工具允許你逐行處理數據:
const q = `FROM kibana_sample_data_logs | KEEP message, response, tags, @timestamp, ip, agent | LIMIT 2 `;const reader = await esClient.helpers.esql({ query: q }).toArrowReader();const toArrowReaderResults = [];for await (const recordBatch of reader) {for (const record of recordBatch) {const recordData = record.toJSON();toArrowReaderResults.push(recordData);}
}console.log(JSON.stringify(toArrowReaderResults, null, 2));
/*RESULT: [{"message": "49.167.60.184 - - [2018-09-16T09:10:01.825Z] \"GET /kibana/kibana-6.3.2-darwin-x86_64.tar.gz HTTP/1.1\" 200 2603 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"","response": "200","tags": ["error","info"],"@timestamp": 1749373801825,"ip": {"0": 49,"1": 167,"2": 60,"3": 184},"agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24"},{"message": "225.72.201.213 - - [2018-09-16T09:37:35.555Z] \"GET /elasticsearch/elasticsearch-6.3.2.zip HTTP/1.1\" 200 6335 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\"","response": "200","tags": ["success","info"],"@timestamp": 1749375455555,"ip": {"0": 225,"1": 72,"2": 201,"3": 213},"agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"}]
*/
toArrowTable
如果你希望在請求完成后一次性將所有結果加載到一個 Arrow 表對象中,而不是以流的方式逐行返回,可以使用 toArrowTable。
當你的數據集可以輕松裝入內存,同時又想利用 Arrow 的零拷貝讀取和緊湊傳輸格式,并保持代碼簡潔時,這個工具就非常有用。
如果應用本身已經在處理 Arrow 數據,toArrowTable 也是一個不錯的選擇,因為你無需對數據進行序列化。此外,由于 Arrow 與編程語言無關,無論使用什么平臺和語言,你都可以使用它。
const q = `FROM kibana_sample_data_logs | KEEP message, response, tags, @timestamp, ip, agent | LIMIT 2 `;const toArrowTableResults = await esClient.helpers.esql({ query: q }).toArrowTable();const arrayTable = toArrowTableResults.toArray();console.log(JSON.stringify(arrayTable, null, 2));
/*RESULT: [{"message": "49.167.60.184 - - [2018-09-16T09:10:01.825Z] \"GET /kibana/kibana-6.3.2-darwin-x86_64.tar.gz HTTP/1.1\" 200 2603 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"","response": "200","tags": ["error","info"],"@timestamp": 1749373801825,"ip": {"0": 49,"1": 167,"2": 60,"3": 184},"agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24"},{"message": "225.72.201.213 - - [2018-09-16T09:37:35.555Z] \"GET /elasticsearch/elasticsearch-6.3.2.zip HTTP/1.1\" 200 6335 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\"","response": "200","tags": ["success","info"],"@timestamp": 1749375455555,"ip": {"0": 225,"1": 72,"2": 201,"3": 213},"agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"}]
*/
總結
Elasticsearch Node.js 客戶端提供的 Apache Arrow 工具有助于高效處理日常任務,例如分析大數據集,并以緊湊且與語言無關的格式接收 Elasticsearch 響應。
在本文中,我們學習了如何使用 ES|QL 客戶端工具,將 Elasticsearch 響應解析為 Arrow Reader 或 Arrow Table。
原文:ES|QL in JavaScript: Leveraging Apache Arrow helpers - Elasticsearch Labs