利用python将elasticsearch的数据存储至MySQL

由于elasticsearch不存在表的概念,其查询结果返回的是json格式的数据,在将数据插入MySQL之前需要将数据解析出来。数据逻辑:读取MySQL数据->解析->存储至MySQL数据库。

创建MySQL数据库连接以及elasticsearch连接

from elasticsearch import Elasticsearch
import pandas as pd
from sqlalchemy import create_engine


##创建es连接
es = Elasticsearch(hosts = 'host:port',http_auth=('username','password'))
##创建mysql连接
con_to_mysql = create_engine("mysql+pymysql://username:password@host:port/database",encoding = 'utf-8')   

接下来就是从es中获取数据并解析数据了;

获取数据闭并解析

这里定义一个函数,实现获取数据并解析数据的功能

def get_data(index,body,scroll):     
    data = es.search(index = index,body = body,scroll = scroll)
    #获取数据标签
    scrollid = data['_scroll_id']
    #数据总量
    total_num = data['hits']['total']
    json_data = data['hits']['hits']
    for i in range(round(total_num / 10000) + 1):
        res = es.scroll(scroll_id=scrollid, scroll='5m')
        json_data += res['hits']['hits']
    
    data_dataframe = pd.DataFrame(json_data)
    detail_data = data_dataframe['_source']
    detail_Data_Dataframe = pd.DataFrame(list(detail_data))
    return detail_Data_Dataframe

因为elasticsearch无法全量查询数据,所以需要创建游标,类似于书签,每次查询10000条数据,es中返回的每条数据可能顺序不一,因此在解析的时候直接将json数据转换成dataframe。

创建主函数,将数据写入MySQL数据库

if __name__ == '__main__':
    
    body = {
  "size": 10000,
  "query": {
    "match_all": {}
  }
}
    gas_bottle = get_data('gas-bottle',body,'5m')
#    Dataframe数据框写入MySQL
    gas_bottle.to_sql('gas-bottle',con = con_to_mysql,if_exists = 'replace',index = False)
    es.close()          #关闭es连接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值