LoginSignup
1
2

More than 1 year has passed since last update.

Elasticsearch のデータを pandas で分析する

Last updated at Posted at 2022-03-28

Elasticsearch(es) にあるデータを、pandas 使って分析したくなり、どうやって es のデータを pandas にロードするか調べました。

  1. Python の es client でクラスターに接続
  2. search API で読み込んだデータを pd.json_normalize() する
  3. 以下ループ処理

このような例が見つかりますが、私が対象としているデータは割とたくさんあるので、もっと気軽にできるツールはないかとさらに調べたら、eland を見つけました。

eland を使うと、es のデータをローカルに持ってこなくても、pandas API を使ってデータ分析ができます。

import eland as ed
from elasticsearch import Elasticsearch

es = Elasticsearch(
    'https://es_cluster:9200',
    ca_certs='ca.crt',
    basic_auth=("elastic", "password")
)

df = ed.DataFrame(es, es_index_pattern="your_index")

およそこのような感じです。DataFrame として操作できますが、データ自体は es にあるので、ローカルマシンがデータで溢れることがありません。

df.info()
<class 'eland.dataframe.DataFrame'>
Index: 1385743 entries, AWISKaLgkLsdlAHXZMg1 to AXOUE9QOl2VpoF9pPHim
Columns: 118 entries, aaa to zzz
dtypes: bool(6), datetime64[ns](5), float64(39), int64(45), object(23)
memory usage: 64.000 bytes
Elasticsearch storage usage: 3.995 GB

eland が提供する pandas 互換APIは限られているので、本家 pandas に変換したいかもしれません。その場合も一行で OK です。

pd_df = ed.eland_to_pandas(df, show_progress=True)
2022-03-28 11:32:50.850852: read 10000 rows
2022-03-28 11:32:57.377126: read 20000 rows
2022-03-28 11:33:03.149467: read 30000 rows
2022-03-28 11:33:13.091023: read 40000 rows
2022-03-28 11:33:24.209532: read 50000 rows
2022-03-28 11:33:31.095330: read 60000 rows
2022-03-28 11:33:37.367170: read 70000 rows
2022-03-28 11:33:45.943025: read 80000 rows
2022-03-28 11:33:51.439257: read 90000 rows
2022-03-28 11:33:58.801443: read 100000 rows
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2