【问题标题】:ElasticSearch aggregation on large dataset大型数据集上的 ElasticSearch 聚合
【发布时间】:2020-11-28 00:43:17
【问题描述】:

我使用 Python ElasticSearch API。 我的数据集太大而无法使用 search() 检索。 我可以用 helpers.scan() 检索它,但数据太大,无法用 pandas 快速处理。

所以我学会了如何使用 ElasticSearch 进行聚合以压缩数据,但仍然使用 search() 我无法检索所有数据。我知道聚合是在“通常”的搜索大小上完成的,即使聚合会给出一行?

最后我尝试了聚合 + 扫描或滚动,但我知道 scan() 或滚动() 不能用于聚合,因为这些请求适用于数据集的子集,然后聚合在子集上是无意义的。

在非常大的数据集上进行聚合的好方法是什么? 我在网上找不到任何相关的解决方案。

更明确地说,我的情况是: 我有 X 数千个移动传感器每小时传输最后一个停止位置,即新的停止位置。从最后一站到新站的移动可能需要几天时间,所以在几天内我没有每小时采集的相关信息。 作为 ElasticSearch 搜索输出,我只需要格式的每个唯一行: sensor_id / last_stop / new_stop

【问题讨论】:

  • 您真正感兴趣的是什么?按传感器 ID 聚合然后呢?还是您只想检索所有内容并将其加载到 pandas 中?
  • 我只需要知道,对于每个传感器,last_stop / mew_stop 的唯一组合。因为我认为检索它比检索所有内容然后使用 pandas 处理数据更容易。

标签: python pandas elasticsearch aggregation


【解决方案1】:

如果您在 pandas 中使用 elastic,您可以尝试 eland 一个新的官方弹性库,该库旨在更好地集成它们。试试:

es = Elasticsearch() 

body = {
  "size": 0,
  "aggs": {
    "getAllSensorId": {
      "terms": {
        "field": "sensor_id",
        "size": 10000
      },
      "aggs": {
        "getAllTheLastStop": {
          "terms": {
            "field": "last_stop",
            "size": 10000
          },
      "aggs": {
        "getAllTheNewStop": {
          "terms": {
            "field": "new_stop",
            "size": 10000
          }
        }
      }
        }
      }
    }
  }
}
list_of_results = []
result = es.search(index="my_index", body=body)
for sensor in result["aggregations"]["getAllTheSensorId"]["buckets"]:
    for last in sensor["getAllTheLastStop"]["buckets"]:
        for new in last["getAllTheNewStop"]["buckets"]:
            record = {"sensor": sensor['key'], "last_stop": last['key'], "new_stop": new['key']}
            list_of_results.append(record)
            

【讨论】:

  • 感谢您提供详细信息,在 aggs 查询中添加 size 参数有很大帮助。所以我知道第一个“大小”告诉您在聚合之前获得了多少文档,而 aggs 字段中的“大小”参数告诉您在聚合之后获得了多少桶?即使开始时 size=0,我们也只能处理 10,000 个文档吗?
  • 每个聚合都基于一组文档的查询结果。如果默认情况下未指定任何查询,则弹性搜索执行 match_all 查询。所以第一个大小参数意味着从 match_all 查询中返回一个大小为 0 的列表,所以你会在结果中看到只有 aggs。
  • No 10.000 to process 是查询的限制,所以是的,您可以处理 10.000 fat 一次。对于 agg,默认限制为 10.000 个存储桶,因此该字段有 10.000 个值 elastic.co/guide/en/elasticsearch/reference/current/… 无论如何,这个 sn-p 是否解决了您的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2019-11-19
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
相关资源
最近更新 更多