我需要从Elasticsearch(es)中获取大量数据,因此我使用的是
代码如下:
我将得到很多词典。至今为止,我的一个天真的解决方案是逐个添加它们,如下所示:
scan
命令,该命令是本地esscroll
命令的一个包装。结果将得到以下生成器对象:<generator object scan at 0x000001BF5A25E518>
。此外,我想将所有数据插入到一个Pandas
DataFrame
对象中,以便我可以轻松处理它。代码如下:
from elasticsearch import Elasticsearch
from elasticsearch.helpers import scan as escan
import pandas as pd
es = Elasticsearch(dpl_server, verify_certs=False)
body = {
"size": 1000,
"query": {
"match_all": {}
}
}
response = escan(client=es,
index="index-*,
query=body, request_timeout=30, size=1000)
print(response)
#<generator object scan at 0x000001BF5A25E518>
我想要做的是将所有结果放入Pandas DataFrame中。如果我按照以下方式打印生成器中的每个元素:
for res in response:
print(res['_source'])
# { .... }
# { .... }
# { .... }
我将得到很多词典。至今为止,我的一个天真的解决方案是逐个添加它们,如下所示:
df = None
for res in response:
if (df is None):
df = pd.DataFrame([res['_source']])
else:
df = pd.concat([df, pd.DataFrame([res['_source']])], sort=True)
我希望知道是否有更好的方法(首先是从速度和代码清晰度两方面考虑)。例如,累加所有生成器的结果到一个列表中,然后构建完整的DataFrame
是否更好?