从 ES|QL 到 Python 中的原生 Pandas 数据帧

news/2024/9/19 8:19:10/ 标签: elasticsearch, python, 大数据, 搜索引擎, pandas, sql

作者:来自 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 Elasticsearchclient = 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


http://www.ppmy.cn/news/1521486.html

相关文章

win11环境android studio中AVD目录修改问题解决

起始原因是我搭建Android studio 调试一个app时,运行模拟器时 出现“The emulator process for AVD xxx has terminated.”的错误 DEBUG | trying to load skin file D:\android\skins\\pixel_6\layout ERROR | Not enough space to create userdata partition…

STM32 系列MCU 开发利器 STM32CubeIDE

前言 由于自己接触较多的 ARM 系列芯片主要是 STM32 系列的,接触过 STM32 F1、F4、L4、H7 等几个系列,使用的 开发工具,主要是 Keil MDK5、IAR,所以也比较关注开发工具的使用。 Keil MDK5、IAR 属于商用收费的功能强大的IDE&…

Ubuntu服务器时间和本地时间不一致怎么解决——Linux的Local Time和RTC time

最近一直在搞大模型的相关工作,所以一直在用Linux服务器,前面的文章里也提到了,我用的是一台Dell PowerEdge R730xd。 但在使用中发现,IDRAC中的日志时间和本地时间存在时差,大概相关8小时。 对于技术人员&#xff0c…

设计模式 - Singleton pattern 单例模式

文章目录 定义单例模式的实现构成构成UML图 单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现 总结其他设计模式文章:最后 定义 单例模式是一种创建型设计模式,它用来保证一个类只有一个实…

Unity中保存数据的方法

一、概述 Unity中可用于持久化的方式有: 1)通过ScriptableObject在可编辑模式下保存数据 2)通过excel、json等文件实现数据的可持久化 二、ScriptableObject的使用 1、使用背景 假如需要制作子弹预设体,每个子弹上有speed速…

ChatGPT付费创作系统V3.0.6独立版 WEB+H5+小程序端 (新增AI全网搜索+文档解析+豆包AI通道)安装部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。这是一种基于人工智能技术的问答系统,可以实现智能回答用户提出的问题。相比传统的问答系统,ChatGPT可以更…

科研绘图系列:R语言宏基因组堆积图(stacked barplot)

介绍 宏基因组堆积条形图是一种数据可视化工具,用于展示宏基因组数据中不同分类群(如微生物群落中的物种或菌株)的相对丰度。宏基因组学(Metagenomics)是一种研究环境样本中所有生物的遗传物质(DNA和RNA)的科学,不依赖于培养,可以直接从环境样本中提取DNA进行测序。 …

软件测试-Selenium+python自动化测试

目录 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览器版本号选择。 一、元素定位 对html网页中的元素进行定位,同时进行部分操作。 1.1一个简单的模板 from selenium import webdriver from selenium.webdrive…

iOS——atomic、nonatomic、assign、_unsafe_unretain

atomic和nonatomic 在iOS开发中,当你定义一个属性时,编译器会自动为你生成一个带下划线的成员变量(实例变量)以及对应的getter和setter方法。如果你使用atomic修饰这个属性,那么编译器在生成setter和getter方法时&…

图欧科技-IMYAI智能助手24年8月更新日志大汇总(含史诗级更新)

IMYAI史诗级更新 图欧君最近行程排得满满当当 但请各位小伙伴放心 我们的更新步伐从未停歇 而这次我们IMYAI主站也迎来了史诗级升级 一起来看看这个8月 我们又新增了哪些功能和优化吧~ 8.26|更新日志 模型选择界面鼠标悬停左右按钮可以自动滚动(手机端长…

【Linux 从基础到进阶】MongoDB 数据库安装与调优

MongoDB 数据库安装与调优 引言 MongoDB 是一个 NoSQL 类型的文档数据库,因其灵活的 JSON 格式存储、水平扩展能力和强大的查询功能而备受开发者青睐。在处理大规模数据时,MongoDB 提供了极高的性能和可扩展性。本文将介绍如何在 CentOS 和 Ubuntu 上安装 MongoDB,并进行必…

Camelyon16数据集切块批量预处理

参考自: Camelyon16数据集切块预处理 区别是这里做了批量处理 数据集目录格式: ** main.py** # !/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2024/9/4 20:21 # Author : 猫娜Lisa # File : camelyon16_get_patch.py # Software: PyC…

java 根据给定的子网掩码和网关计算起始IP和结束IP

java 根据给定的子网掩码和网关计算起始IP和结束IP 以下是一个Java工具类,用于根据给定的子网掩码和网关计算起始IP和结束IP。 import java.net.InetAddress; import java.net.UnknownHostException;public class IPUtils {public static void main(String[] args…

力扣-9. 回文数

文章目录 力扣题目代码工程方法1:方法2: 力扣题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左…

Linux基础网络编程-Socket通信

本文使用C语言,在Centos实现Socket两种通信类型(TCP和UDP) 文章目录 一、安装gcc二、使用TCP协议,实现Socket(SOCKE_STREAM)流式通信1. 编写TCP_server.c函数和参数解释 2.编写TCP_client.c函数和参数解释 3. 编译并运行上述两个文件3.1 编译3.2 运行(启…

MyBatis的动态SQL---组合条件查询与传递集合和数组(超详细)

MyBatis的动态SQL—组合条件查询与传递集合和数组(超详细) 文章目录 MyBatis的动态SQL---组合条件查询与传递集合和数组(超详细)一、 定义二、mybatis提供的几大标签1. if 标签2. choose、when和otherwise标签3. trim标签4. forea…

微信小程序垃圾回收的前景方向

在当今这个环保意识日渐增强的时代,如何有效处理日常生活产生的垃圾已成为亟待解决的社会问题。微信小程序凭借其便捷性和广泛的用户基础,在推广垃圾分类与回收方面展现出巨大潜力。作为一款集智能化分类指导、在线预约回收、环保知识普及于一体的微信小…

OSPFV3 华为

1 OSPFV3简介 (IPV6) 定义 OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。 目前针对IPv4协议使用的是OSPF Version 2,针对IPv6协议使用OSPF Version 3。 OSPFv3是OSPF Version 3的简称。OSPFv3是运行于I…

opencv 实现两个图片的拼接去重功能

基础知识介绍 cv::Mat 是OpenCV库中用来表示图像和矩阵数据的核心类之一。它是一个多维数组,可以存储图像像素数据、矩阵数据以及其他类型的数据。以下是关于 cv::Mat 类的一些详细解释: 构造函数:cv::Mat 类有多个构造函数,可以用…

计算机的错误计算(八十四)

摘要 讨论双曲余割函数 csch(x)的计算精度问题。 例1. 计算 csch(320.97) . 不妨在 LibreOffice的电子表格中计算,则有: 若利用 csch(x) 1/sinh(x) 在Java中计算: import java.lang.Math; public class Csch{public static void main(S…