Elasticsearch:从 ES|QL 到 Python 数据帧

在我之前的文章 “Elasticsearch:ES|QL 查询展示”,我展示了如何在 Kibana 中使用 ES|QL 对索引来进行查询及统计。在很多的情况下,我们需要在客户端中来对数据进行查询,那么我们该怎么办呢?我们需要使用到 Elasticsearch 的客户端。在今天的文章中,我们来展示如何使用 Python 来对数据进行查询。

注意:为了使用 ES|QL,我们的 Elastic Stack 版本至少在 8.12 及以上。

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
  • Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana

在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。特别值得指出的是:ES|QL 只在 Elastic Stack 8.11 及以后得版本中才有。你需要下载 Elastic Stack 8.11 及以后得版本来进行安装。

在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:

我们需要记下 Elasticsearch 超级用户 elastic 的密码。

我们还需要安装 Elasticsearch 的 python 依赖包:

pip3 install elasticsearch==8.12.1
$ pip3 list | grep elasticsearch
elasticsearch                8.12.1

准备数据

我们参考之前的文章 “Elasticsearch:ES|QL 查询展示” 来创建索引:

PUT sample_data
{
  "mappings": {
    "properties": {
      "client.ip": {
        "type": "ip"
      },
      "message": {
        "type": "keyword"
      }
    }
  }
}
PUT sample_data/_bulk
{"index": {}}
{"@timestamp": "2023-10-23T12:15:03.360Z", "client.ip": "172.21.2.162", "message": "Connected to 10.1.0.3", "event.duration": 3450233}
{"index": {}}
{"@timestamp": "2023-10-23T12:27:28.948Z", "client.ip": "172.21.2.113", "message": "Connected to 10.1.0.2", "event.duration": 2764889}
{"index": {}}
{"@timestamp": "2023-10-23T13:33:34.937Z", "client.ip": "172.21.0.5", "message": "Disconnected", "event.duration": 1232382}
{"index": {}}
{"@timestamp": "2023-10-23T13:51:54.732Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 725448}
{"index": {}}
{"@timestamp": "2023-10-23T13:52:55.015Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153}
{"index": {}}
{"@timestamp": "2023-10-23T13:53:55.832Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 5033755}
{"index": {}}
{"@timestamp": "2023-10-23T13:55:01.543Z", "client.ip": "172.21.3.15", "message": "Connected to 10.1.0.1", "event.duration": 1756467}

使用 Elasticsearch 客户端来进行查询

Elasticsearch 查询语言 (ES|QL) 提供了一种强大的方法来过滤、转换和分析 Elasticsearch 中存储的数据。 它旨在易于最终用户、SRE 团队、应用程序开发人员和管理员学习和使用。 但它也非常适合熟悉 Pandas 和其他基于数据框的框架的数据科学家。

事实上,ES|QL 查询会生成带有命名列的表,即数据帧。 但是如何使用 Python 处理这些数据呢? ES|QL 目前没有 Apache Arrow 输出,但 CSV 输出是一个很好的开始。

我们使用如下的测试程序:

esql.py

from io import StringIO
import numpy as np
import os

from elasticsearch import Elasticsearch
import pandas as pd

endpoint = os.getenv("ES_SERVER")
username = os.getenv("ES_USER")
password = os.getenv("ES_PASSWORD")
fingerprint = os.getenv("ES_FINGERPRINT")
 
url = f"https://{endpoint}:9200"
 
es = Elasticsearch( url ,
    basic_auth = (username, password),
    ssl_assert_fingerprint = fingerprint,
    http_compress = True )
 
# print(es.info())

response = es.esql.query(query="FROM sample_data", format="csv")
df = pd.read_csv(StringIO(response.body))
print(df)
print("==================================================================")

response = es.esql.query(
    query="""
    FROM sample_data
    | LIMIT 5
    | sort @timestamp desc
    | WHERE event.duration > 3000000
    | WHERE message LIKE "Connection *"
    """,
    format="csv"
)

df = pd.DataFrame = pd.read_csv(StringIO(response.body))

print(df)
print("==================================================================")


response = es.esql.query(
    query="""
    FROM sample_data
    | STATS avg=AVG(event.duration), count=COUNT(*) BY client.ip
    | SORT count
    """,
    format="csv"
)

df = pd.DataFrame = pd.read_csv(
    StringIO(response.body),
    dtype={"count":"Int64", "avg":np.float64}
)

print(df)
print("==================================================================")

在运行上面的代码之前,我们需要在 terminal 中设置相应的环境变量:

export ES_SERVER="localhost"
export ES_USER="elastic"
export ES_PASSWORD="q2rqAIphl-fx9ndQ36CO"
export ES_FINGERPRINT="bce66ed55097f255fc8e4420bdadafc8d609cc8027038c2dd09d805668f3459e"

然后,我们使用如下的命令来运行:

python3 esql.py
$ python3 esql.py 
/Users/liuxg/python/esql/esql.py:22: ElasticsearchWarning: No limit defined, adding default limit of [500]
  response = es.esql.query(query="FROM sample_data", format="csv")
                 @timestamp     client.ip  event.duration                message
0  2023-10-23T12:15:03.360Z  172.21.2.162         3450233  Connected to 10.1.0.3
1  2023-10-23T12:27:28.948Z  172.21.2.113         2764889  Connected to 10.1.0.2
2  2023-10-23T13:33:34.937Z    172.21.0.5         1232382           Disconnected
3  2023-10-23T13:51:54.732Z   172.21.3.15          725448       Connection error
4  2023-10-23T13:52:55.015Z   172.21.3.15         8268153       Connection error
5  2023-10-23T13:53:55.832Z   172.21.3.15         5033755       Connection error
6  2023-10-23T13:55:01.543Z   172.21.3.15         1756467  Connected to 10.1.0.1
==================================================================
                 @timestamp    client.ip  event.duration           message
0  2023-10-23T13:52:55.015Z  172.21.3.15         8268153  Connection error
==================================================================
/Users/liuxg/python/esql/esql.py:44: ElasticsearchWarning: No limit defined, adding default limit of [500]
  response = es.esql.query(
          avg  count     client.ip
0  1232382.00      1    172.21.0.5
1  3450233.00      1  172.21.2.162
2  2764889.00      1  172.21.2.113
3  3945955.75      4   172.21.3.15
==================================================================

很显然,我们得到了最终的结果。


http://www.niftyadmin.cn/n/5410976.html

相关文章

使用数据库实现增删改查

#include<myhead.h>//定义添加数据函数int do_add(sqlite3 *ppDb) {//1.准备sql语句,输入要添加的信息int add_numb; //工号char add_name[20]; //姓名char add_sex[10]; //性别double add_score; //工资printf("请输入要添加的工号:")…

HTML 中常用的排版标签

概述 HTML页面的排版可以把它当作是在写一个Word 文档&#xff0c;Word 中有文字和图片&#xff0c;可以设置图片的位置、文字的样式和段落结构等。当然&#xff0c;对于前端来说&#xff0c;并不满足于 Word 的功能&#xff0c;那就可以借助 CSS 来让它变成一个PPT&#xff0…

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按&#xff1a;随着 LLM 赋能越来越多需要实时决策和响应的应用场景&#xff0c;以及用户体验不佳、成本过高、资源受限等问题的出现&#xff0c;大模型高效推理已成为一个重要的研究课题。为此&#xff0c;Baihai IDP 推出 Pierre Lienhart 的系列文章&#xff0c;从多个维…

智慧城市中的数据力量:大数据与AI的应用

目录 一、引言 二、大数据与AI技术的融合 三、大数据与AI在智慧城市中的应用 1、智慧交通 2、智慧环保 3、智慧公共安全 4、智慧公共服务 四、大数据与AI在智慧城市中的价值 1、提高城市管理的效率和水平 2、优化城市资源的配置和利用 3、提升市民的生活质量和幸福感…

python 键盘码操作

参考&#xff1a; https://blog.csdn.net/lhkuxia/article/details/123727389 将键盘码转为字符&#xff1a; keyboard_code "63" # 键盘码&#xff08;不带问号&#xff09; character chr(int(keyboard_code)) # 将键盘码转换为字符 print("键盘码带问号后…

【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言

​​发表时间&#xff1a;2024年2月21日 BSV区块链协会宣布上线JavaScript和TypeScript SDK&#xff08;即“标准开发工具包”&#xff09;。TypeScript SDK旨在为开发者提供新版统一核心代码库&#xff0c;以便利开发者在BSV区块链上开发能够任意扩容的应用程序。新上线的SDK替…

基于深度学习的语音识别的未来

基于深度学习的语音识别是当前人工智能领域的研究热点之一。随着语音技术的不断发展&#xff0c;语音识别技术将在未来扮演更加重要的角色。 语音识别技术的发展已经有几十年的历史&#xff0c;但是基于深度学习的语音识别技术在近年来才取得了突破性的进展。深度学习技术可以…

Tensorflow2.0笔记 - 常见激活函数sigmoid,tanh和relu

本笔记主要记录常见的三个激活函数sigmoid&#xff0c;tanh和relu&#xff0c;关于激活函数详细的描述&#xff0c;可以参考这里&#xff1a; 详解激活函数&#xff08;Sigmoid/Tanh/ReLU/Leaky ReLu等&#xff09; - 知乎 import tensorflow as tf import numpy as nptf.__ve…