从 ES|QL 到 Python 中的原生 Pandas 数据帧
作者:来自 Elastic Quentin Pradet
自 Elasticsearch 8.15 或 Elasticsearch Serverless 以来,ES|QL 响应支持 Apache Arrow 流式传输格式。这篇博文将向你展示如何在 Python 中利用它。在之前的一篇博文中,我演示了如何使用 CSV 作为中间表示将 ES|QL 查询转换为 Pandas 数据帧。不幸的是,CSV 需要显式类型声明,速度很慢(尤其是对于较大的数据集),并且不处理嵌套数组和对象。Apache Arrow 消除了所有这些限制。
ES|QL 到 Python 中的 Pandas 数据帧
导入测试数据
首先,让我们导入一些测试数据。和以前一样,我们将使用 employees 样本数据和映射。加载此数据集的最简单方法是在 Kibana 控制台中运行这两个 Elasticsearch API 请求。
将数据集转换为 Pandas DataFrame 对象
好的,解决了这个问题后,让我们使用 ES|QL Arrow 导出将完整的 employees 数据集转换为 Pandas DataFrame 对象:
from elasticsearch import Elasticsearch client = Elasticsearch( "https://[host].elastic-cloud.com", api_key="...", ) response = client.esql.query( query="FROM employees | DROP is_rehired,job_positions,salary_change* | LIMIT 500", format="arrow", ) df = response.to_pandas() print(df)
尽管此数据集仅包含 100 条记录,但我们仍使用 LIMIT 命令来避免 ES|QL 警告我们可能缺少记录。这将打印以下数据框:
avg_worked_seconds birth_date emp_no ... last_name salary still_hired 0 268728049 1953-09-02 10001 ... Facello 57305 True 1 328922887 1964-06-02 10002 ... Simmel 56371 True 2 200296405 1959-12-03 10003 ... Bamford 61805 False 3 311267831 1954-05-01 10004 ... Koblick 36174 True 4 244294991 1955-01-21 10005 ... Maliniak 63528 True .. ... ... ... ... ... ... ... 95 204381503 1954-09-16 10096 ... Mandell 43889 False 96 206258084 1952-02-27 10097 ... Waschkowski 71165 False 97 272392146 1961-09-23 10098 ... Servieres 44817 False 98 377713748 1956-05-25 10099 ... Sullins 73578 True 99 223910853 1953-04-21 10100 ... Haraldson 68431 True [100 rows x 17 columns]
好的,那么这里到底发生了什么?
- 给定 format="arrow",Elasticsearch 返回二进制 Arrow 流数据
- Elasticsearch Python 客户端查看 Content-Type header 并创建 PyArrow 对象
- 最后,PyArrow 的 Pandas 集成将 PyArrow 对象转换为 Pandas 数据帧。(请注意,在大多数情况下,这不是零拷贝转换。)
这意味着要使此示例正常工作,需要安装 Pandas 和 PyArrow 可选依赖项。请注意,Pandas 本身不是严格必需的,只有 PyArrow 是必需的。如果你想改用 Polars,可以使用 from_arrow 从客户端返回的 PyArrow 表中创建 Polars 数据框。
一个限制是 Elasticsearch 目前不处理多值字段,这就是我们不得不删除 is_rehired、job_positions 和 salary_change 列的原因。此限制将在 Elasticsearch 的未来版本中取消。
无论如何,你现在有一个 Pandas 数据帧,你可以使用它来进一步分析数据。但是你也可以继续使用 ES|QL 处理数据,这在查询返回超过 10,000 行(ES|QL 查询当前可以返回的最大行数)时特别有用。
更复杂的查询
在下一个示例中,我们使用 STATS ... BY(与 SQL 中的 GROUP BY 类似)计算有多少员工讲某种语言。然后我们使用 SORT 对 languages 列的结果进行排序:
response = client.esql.query( query=""" FROM employees | DROP is_rehired,job_positions,salary_change* | STATS count = COUNT(emp_no) BY languages | SORT languages | LIMIT 500 """, format="arrow", ) df = response.to_pandas() print(df)
与 CSV 不同,我们不必指定任何类型,因为 Arrow 数据已经包含类型。结果如下:
count languages 0 15 1.0 1 19 2.0 2 17 3.0 3 18 4.0 4 21 5.0 5 10 NaN
21 名员工讲 5 种语言,哇!
带参数的查询
最后,假设你想要扩展上一节中的查询以仅考虑会说 N 种或更多语言的员工,其中 N 是可变参数。为此,我们可以使用 ES|QL 内置的参数支持,这消除了手动组装带有可变部分的查询所带来的注入攻击风险:
response = client.esql.query( query=""" FROM employees | DROP is_rehired,job_positions,salary_change* | STATS count = COUNT(emp_no) BY languages | WHERE languages >= (?) | SORT languages | LIMIT 500 """, format="arrow", params=[3], ) df = response.to_pandas() print(df)
打印内容如下:
count languages 0 17 3 1 18 4 2 21 5
结论
正如我们所见,ES|QL 的原生 Arrow 支持使得使用 Pandas 和其他 DataFrame 库比使用 CSV 更加方便,并且随着时间的推移,它将不断改进,未来版本的 Elasticsearch 将提供多值支持。
其他资源
如果你想了解有关 ES|QL 的更多信息,ES|QL 文档是最好的起点。你还可以查看使用波士顿凯尔特人队数据的其他 Python 示例。要了解有关 Python Elasticsearch 客户端本身的更多信息,你可以参考文档,在讨论中使用 language-clients 标签提问,或者在发现错误或有功能请求时提交新问题。谢谢!
准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!
原文:From ES|QL to native Pandas dataframes in Python — Search Labs

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
还不知道这个原则的程序员,要小心了
大家好,我是陈哥,今天聊聊规范优先原则~ 背景 前几天,和我同事闲谈,聊到我在来禅道之前参与过的一个项目。当时,小团队对代码规范不够重视,结果合并代码时出现大量格式冲突,解决问题费时费力,最终项目的完成时间远远超过我们对项目预估的工时。 “无规矩不成方圆”,来了禅道以后才发现,其实小公司也应该有自己的代码规范。大家如果对禅道的代码规范感兴趣的话,我先赠送大家一份【禅道资料】和大家分享禅道的代码规范,下篇文章将会详细介绍,扫码备注【禅道资料】即可免费领取。 那么,今天的文章先和大家讲讲规范优先原则,希望大家重新认识规范优先原则。 发送【禅道资料】,免费获取学习资料 一、什么是规范优先? 在《国富论》开篇写道:“一个好的经济制度,就是鼓励每个人去创造更多的财富。”这句话放在规范优先原则中也同样使用,“规范优先原则,就是鼓励每一个程序员去写更优秀的代码。” 规范优先是一种软件开发方法,其原则是产品需求规范应在实际编码阶段开始之前制定和批准。这意味着开发团队首先定义应用程序界面的外观、哪些端点(方法)可用、应该传输哪些数据以及以何种方式传输,从而促进更结构化和可预测的开发过程。 规范优先方法发...
- 下一篇
RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览
欢迎大家收看《RWKV 社区最新动态》第五期,本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版(TL;DR) RWKV 官方新闻动态 RWKV-7 发布预览版 RWKV-7 论文撰写已面向社区开放 RWKV 官网上线 Bad Case 收集页面 RWKV 中文文档已开源 RWKV 学术研究相关 RWKV-CLIP 论文被 EMNLP 主会收录 新论文:OccRWKV(3D 语义占用预测) 新论文:MSRWKV-2DTCN(光伏发电预测) 新论文:Mod-RWKV(多模态内容审核) 新论文:OnlySportsLM(体育运动任务) 新论文:RWKV-TIM(人类动作交互建模) 社区新项目 RWKV-nonogram RWKV 官方新闻动态 RWKV-7 发布预览版 RWKV-7(代号 Goose 雁)现已推出预览版! RWKV-7 超越了 attention / linear attention 范式,它的状态演化很灵活,可以解决在相同算力消耗下 attention 无法解决的问题。 RWKV-7 代码:https://github.com/BlinkD...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19