Elasticsearch(es) にあるデータを、pandas 使って分析したくなり、どうやって es のデータを pandas にロードするか調べました。
- Python の es client でクラスターに接続
- search API で読み込んだデータを pd.json_normalize() する
- 以下ループ処理
このような例が見つかりますが、私が対象としているデータは割とたくさんあるので、もっと気軽にできるツールはないかとさらに調べたら、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