python - 从 ElasticSearch 结果创建 DataFrame

标签 python pandas elasticsearch

我正在尝试在 pandas 中构建一个 DataFrame,使用对 Elasticsearch 进行非常基本的查询的结果。我得到了我需要的数据,但它需要对结果进行切片以构建正确的数据框。我真的只关心获取每个结果的时间戳和路径。我尝试了几种不同的 es.search 模式。

代码:

from datetime import datetime
from elasticsearch import Elasticsearch
from pandas import DataFrame, Series
import pandas as pd
import matplotlib.pyplot as plt
es = Elasticsearch(host="192.168.121.252")
res = es.search(index="_all", doc_type='logs', body={"query": {"match_all": {}}}, size=2, fields=('path','@timestamp'))

这给出了 4 个数据 block 。 [u'hits', u'_shards', u'took', u'timed_out']。我的结果在点击中。

res['hits']['hits']
Out[47]: 
[{u'_id': u'a1XHMhdHQB2uV7oq6dUldg',
  u'_index': u'logstash-2014.08.07',
  u'_score': 1.0,
  u'_type': u'logs',
  u'fields': {u'@timestamp': u'2014-08-07T12:36:00.086Z',
   u'path': u'app2.log'}},
 {u'_id': u'TcBvro_1QMqF4ORC-XlAPQ',
  u'_index': u'logstash-2014.08.07',
  u'_score': 1.0,
  u'_type': u'logs',
  u'fields': {u'@timestamp': u'2014-08-07T12:36:00.200Z',
   u'path': u'app1.log'}}]

我唯一关心的是获取时间戳和每次点击的路径。

res['hits']['hits'][0]['fields']
Out[48]: 
{u'@timestamp': u'2014-08-07T12:36:00.086Z',
 u'path': u'app1.log'}

我终其一生都无法弄清楚是谁将结果放入 pandas 的数据框中。所以对于我返回的 2 个结果,我希望有一个类似的数据框。

   timestamp                   path
0  2014-08-07T12:36:00.086Z    app1.log
1  2014-08-07T12:36:00.200Z    app2.log

最佳答案

或者你可以使用 pandas 的 json_normalize 函数:

from pandas import json_normalize
# from pandas.io.json import json_normalize
df = json_normalize(res['hits']['hits'])

然后按列名过滤结果数据框

关于python - 从 ElasticSearch 结果创建 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186148/

相关文章:

elasticsearch - 在单个搜索查询ElasticSearch v7.3中获取 token 位置

python - rio.plot.show 带颜色条?

python - 如何将数据框的日期和时间列转换为 Pandas 的日期时间格式?

python - 将交替值添加到具有重复值的字符串

java - 关于将 Elasticsearch 编译成 JAR 的问题,就像在 Maven 存储库中如何完成一样

plugins - elasticsearch插件更新

python - 使用 shell 脚本中的选项调用 python 函数

集合内匹配的Python正则表达式

python - 如何使用 Python 检查文件保存是否完成?

python - 将元组分配给 pandas 数据帧的多个元素