JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 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 客户端中包含了一些处理这些格式的工具。

本文将介绍最新的工具: toArrowReadertoArrowTable,它们在 Elasticsearch Node.js 客户端中专门支持 Apache Arrow。更多关于工具的内容,请查看这篇文章。

什么是 Apache Arrow?

Apache Arrow 是一种列式数据分析工具,使用与现代环境中各种编程语言无关的通用格式。

Arrow 格式的主要优点之一是其二进制列式结构经过优化,可实现非常快速的读取,从而支持高性能的分析计算。

来源: Format | Apache 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…

一个小小的 flask app, 几个小工具,拼凑一下

1. 起因, 目的: 自己的工具,为自己服务。给大家做参考。项目地址: https://github.com/buxuele/flask_utils 2. 先看效果 3. 过程: 一个有趣的 Flask 工具集:从无到有的开发历程 缘起:为什么要做这个项目&#xff…

织梦dedecms怎样用标签调用随机数?

​在使用织梦模板建站中,随机数作为一个偶尔使用到的参数,在具体使用中虽然用的少,但是今天跟版网小编给大家介绍下,大家可以参考下: 实现随机数的调用可以使用下面的js: 方法一:js代码 Math…

访问服务器项目,服务器可以ping通,但是端口访问不到

原因:端口未开放 假设项目部署服务器为205,在90服务器访问205项目 1、首先在205确定项目启动,看端口是否占用 # Windows(检查端口占用) netstat -ano | findstr "8103"期望输出: TCP 0.0.…

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建网站智能客服助手

目录 一、前言 二、ModelArts Studio(MaaS)介绍与应用场景 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、华为云Flexus简介 3.1 …

『uniapp』url拦截屏蔽 避免webview中打开淘宝店铺自动跳转淘宝

目录 分析1. wv.overrideUrlLoading2. 参数 `mode: allow`3. 参数 `match: ^(http|https)://.*`4. 回调函数 `function(e) { console.warn(allow url:, e.url); }`作用:可能的应用场景:核心代码总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新…

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…

Zookeeper 和 Kafka 版本与 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …

V837s-SDK Telnetd服务连接不上异常解决

目录 前言 一、检查 Telnetd 服务是否启动 二、问题解决 总结 前言 在基于 V837s-SDK 进行开发的过程中,Telnetd 服务连接不上是一个较为常见且棘手的问题。Telnet 作为一种远程登录协议,在开发调试时为我们提供了便捷的远程操作方式。若其连接出现异常,将严重影响开发进度…

滑动窗口最大值和最小值

题目: 思路: 窗口进行滑动时,需要快速获取min和max,因此需要一个结构来保存最值,而不是临时计算。动态的最值更新容易联想到单调栈,但是这里需要频繁增删元素,因此用双端队列,front…

JVM——对象创建全家桶:JVM中对象创建的模式及最佳实践

引入 在 Java 应用开发中,对象创建是最基础且高频的操作,但往往也是性能优化的关键切入点。想象一个在线阅读平台,每天需要创建数百万个 Book 对象来统计阅读数据。如果每个对象的创建过程存在内存浪费或性能瓶颈,累积效应将导致…

VSCode中PHP使用Xdebug

本地环境 windows10php8.2 ntsxdebug v3thinkphp v8 下载Xdebug Xdebug下载地址 从xdebug下载地址,下载最新的xdebug,解压后将php_xdebug.dll放入php目录的ext目录下 配置php.ini [Xdebug] zend_extension php_xdebug xdebug.client_host 127.0.0.1 xdebug.client_port…

金融系统渗透测试

金融系统渗透测试是保障金融机构网络安全的核心环节,它的核心目标是通过模拟攻击手段主动发现系统漏洞,防范数据泄露、资金盗取等重大风险。 一、金融系统渗透测试的核心框架 合规性驱动 需严格遵循《网络安全法》《数据安全法》及金融行业监管要求&am…

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…

PHP 项目中新增定时任务类型的详细步骤(以 CRMEB 为例)

1.首先需要在下面文件中增加定时任务类型 2.在app\services\system\crontab\CrontabRunServices类中增加第一步中与定时任务类型同名的方法,注意需要下划线转小驼峰 例如定时任务的类型为:order_tick,而在CrontabRunServices类中的方法名称为&#xff1…

Day27 函数专题2:装饰器

1.装饰器的思想:进一步复用 装饰器(Decorator)是 Python 中一种强大的编程工具,核心作用是在不修改原函数代码的前提下,为函数添加额外功能(如日志记录、性能统计、权限校验等)。它充分利用了 …

Qt进阶开发:动画框架的介绍和使用

文章目录 一、QPropertyAnimation 简介二、基本用法三、常用属性和方法四、支持的属性&#xff08;部分常用&#xff09;五、多个动画组合六、使用缓和曲线七、状态机框架 一、QPropertyAnimation 简介 #include <QPropertyAnimation>QPropertyAnimation 可以让你在一段…

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…