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

news2025/6/12 23:18:01

作者:来自 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.coloradmin.cn/o/2407881.html

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

相关文章

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…