ELK---Python实现Mysql数据导入到ES,及Geoip数据类型写入

2023-05-16

使用环境:Python3.6

准备Py包:  elasticsearch、geoip2、pymysql

下面上代码

1.导入必要的模块

# encoding:utf-8

from elasticsearch import Elasticsearch
from elasticsearch import helpers
import geoip2.database
import pymysql

2.封装获取Mysql数据的函数,按指定参数传入即可,并返回结果集

    def get_data(host, port, user, password, database, sql):
        """
        :param host: 服务器地址
        :param port:端口号
        :param user:用户名
        :param password:密码
        :param database:数据库
        :param sql:执行语句
        :return:结果集
        """
        db = pymysql.connect(host=host, port=port, user=user, password=password, database=database)
        cursor = db.cursor()
        cursor.execute(sql)
        dt = cursor.fetchall()
        db.close()
        return dt

3.封装获取IP地址对应地理信息的函数

def select_ip(ip):
    """
    :param ip:Ip地址
    :return:返回拼凑的Body数据
    """
    reader = geoip2.database.Reader(
        'F:\logstash-7.3.1\config\GeoLite2-City.mmdb')  # 这里引用的是我本地logstash的GeoIP的数据包,按照本机路径替换掉即可
    data = reader.city(ip)
    body_son = {}
    body_son["country_code2"] = data.country.iso_code  # 国家
    body_son["longitude"] = data.location.longitude  # 经度
    body_son["timezone"] = data.location.time_zone  # 时区
    body_son["ip"] = data.traits.ip_address  # Ip地址
    body_son["country_code3"] = data.registered_country.iso_code  # 注册国家
    body_son[
        "region_code"] = data.subdivisions.most_specific.iso_code  # 区域代码 subdivisions的属性 要通过 most_specific点出来,暂没发现原因
    body_son["latitude"] = data.location.latitude  # 维度
    body_son["country_name"] = data.country.names['en']  # 国家名称
    body_son["location"] = {"lon": data.location.longitude, "lat": data.location.latitude}  # 经纬坐标
    body_son["continent_code"] = data.continent.code  # 大洲
    return body_son

4.封装批量插入ES数据的函数

    def insert_batch_index(server, port, actions):
        """
        :param server: 服务器地址
        :param port: 端口号
        :param actions:数据列表
        """
        es = Elasticsearch([server], prot=port)
        res = helpers.bulk(es, actions)

5.最终执行主体函数(以下我的示例代码,具体参数值,根据中文注释修改为自身的参数即可)

# 写入登录数据到ES
def main():
    # 获取Mysql登录数据
    login_data = GetDataMethod.get_data(host='192.168.40.9', port=3306, user='root', password='123456',
                                        database='wechat',
                                        sql='select LoginID,LanIP,OpenTime,TotalAmount from  sys_re_agentlogin where LoginID<=1500')
    es_body = {
        "mappings": {
            # es 7 默认不再支持指定索引类型,默认索引类型是_doc,索引不能指定索引类型参数
            "properties": {
                "LoginID": {"type": "long"},
                "LanIP": {"type": "text"},
                "OpenTime": {"type": "date"},
                "TotalAmount": {"type": "text"},
                "geoip.ip": {"type": "ip"},
                "geoip.location": {"type": "geo_point"}
            }
        }
    }
    # 创建索引
    EsMethod.create_index('py_wechat_login', '192.168.99.100', 9200, es_body)
    # 写入数据
    actions = []
    for dt_son in login_data:
        action = {
            "_index": 'py_wechat_login', #索引名称
            "_type": '_doc',  #索引类型,默认_doc,最好不要改动
            "_id": dt_son[0], #记录ID
            "_source": {
                "LoginID": dt_son[0],
                "LanIP": dt_son[1],
                "OpenTime": dt_son[2],
                "TotalAmount": dt_son[3],
                "geoip": select_ip(dt_son[1])
            }
        }
        actions.append(action)
    insert_batch_index('192.168.99.100', 9200, actions)

结尾:过程中其实还是碰到不少问题的,这是最终完整处理后可以运行的结果,有疑问的童鞋可以评论交流!

------------原创,纯手打,觉得对您有帮助的话,帮忙点个赞哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ELK---Python实现Mysql数据导入到ES,及Geoip数据类型写入 的相关文章

随机推荐

  • vue el-table 如何实现表格根据分页索引自增长

    在el table 里设置type 61 index xff0c 可以实现表格的索引自增长 xff0c 但是如果我们给表格增加了分页 xff0c 切换页面索引任然是从1 20 xff08 20是自己分页的数量 xff09 xff0c 那么想
  • Vue的计算属性和监听属性

    1 计算属性 computed 当依赖数据发生变化时 xff0c 计算属性会被重新计算 有且只有在依赖数据发生变化时它才会重新计算 xff0c 其他的数据变化对计算属性 应用场景 xff1a 数据的计算显示 v for用v if的计算 sp
  • Element UI el-form-item 遍历表单校验规则

    一 遍历表单校验规则实现案例 prop内容为 遍历数据 43 index 43 校验数据 span class token operator lt span div span class token keyword class span s
  • uni-app引入uView2.0的步骤

    引入uVIew组件可以使用uni app市场插件安装插件即可 xff0c 也可以使用npm下载安装 xff0c 不过使用npm需要在pages json使用easycom属性引用需要的组件类 在uni app插件市场右上角选择使用HBuil
  • Vue-cli创建项目步骤

    一 使用 vue cli 搭建项目 下面整个过程是基于已经安装node js和cnpm的基础上 xff0c node js如何安装就不在这里详说了 xff08 1 xff09 全局安装 vue cli xff0c 在命令提示窗口执行 xff
  • keil5建立工程

    1 xff0c 确认工程代码 主要包括代码的目录或者代码的svn路径 xff0c 其次再来确认代码的编译方法 xff0c 确认该代码是需要keil5编译还是linux gcc 43 makefile 编译 2 xff0c 确认编译手段 确认
  • win10下 frpc的开机自启动

    frp可以用来进行内网穿透 xff0c 其具体实现原理可以参考网上其他教程 xff0c 本文主要描述用户端程序frpc exe在win10下的一种开机自启动方法 本地组策略 在完成配置最后 xff0c 需要进行自启动配置 xff0c 一般的
  • qt 设置背景图片、背景色步骤

    拖一个label 控件 label 上右键选择改变样式表 xff0c 添加资源选择图片 一 设置背景图 background image xff1a 二 铺满整个label border image xff1a 三 添加图片 xff0c i
  • QT 设置按钮QPushButton 圆角、渐变色背景、背景图片、鼠标放上去、鼠标按下效果、透明背景

    设置按钮圆角 渐变色背景 背景图片 鼠标放上去 鼠标按下效果 透明背景 效果 xff1a 一 设置四角圆角 xff1a 二 设置下 左圆角 按钮鼠标放上去改变背景色 三 设置上 右圆角 四 按钮设置背景图片 xff0c 鼠标放上去 按下 更
  • processlist中状态详解

    在processlist中 xff0c 看到哪些运行状态时要引起关注 xff0c 主要有下面几个 xff1a 状态建议copy to tmp table执行ALTER TABLE修改表结构时建议 xff1a 放在凌晨执行或者采用类似pt o
  • 在oVirt上安装Win11虚拟机

    在oVirt上安装Win11虚拟机
  • 【Debugging】树莓派 SSH连接失败解决

    问题描述 在使用SSH连接时出现如下错误 xff1a Remote side unexpectedly closed network connection 解决方案 修改ssh的配置文件 etc ssh sshd config xff0c
  • ubantu 18.x 学习记录

    安装net tools 用于 ifconfig命令 span class token function sudo span span class token function apt get span span class token fu
  • 雷达辐射源调制信号仿真

    雷达辐射源调制信号仿真 说明 xff1a 通过Matlab进行单载频 xff08 CW xff09 xff0c 线性调频 xff08 LFM xff09 非线性调频 xff08 NLFM xff09 二相编码 xff08 BPSK xff0
  • nvidia-smi报错 NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver.

    1 报错 xff1a nvidia smi报错 NVIDIA SMI has failed because it couldn t communicate with the NVIDIA driver Make sure that the
  • 自定义Request数据包欺骗服务器拿数据

    自定义Request数据包欺骗服务器拿数据 背景思路 xff1a 值得记录的知识点 背景 一个连接服务器的APK xff0c 登录方式 xff1a 电话号码 43 短信验证 xff0c 登录后可以查询到该账号下的几百条数据 xff0c 每一
  • Qt下C++的cout输出中文信息乱码问题解决

    在Qt中使用C 43 43 的cout时 xff0c 发现打印出的中文时乱码的 xff0c 如下 xff1a 解决办法 xff1a 第一步 xff1a 加入头文件 61 61 include lt windows h gt 61 61 解决
  • C51单片机学习笔记(六)——液晶显示屏的使用

    C51单片机学习笔记 六 液晶显示屏的使用 文章目录 C51单片机学习笔记 六 液晶显示屏的使用1 LCD1602的认识2 LCD1602的引脚及其功能3 LCD模块的内部结构4 LCD1602的工作时序5 LCD1602的指令说明6 LC
  • ubuntu20.04中安装ROS系统,详细介绍各种错误解决方法,直达小海龟

    因为最近学习的缘故 xff0c 花了半天的时间安装了ROS xff0c 期间因为ubuntu也是临时安装的双系统 xff0c 遇到了各种各样的问题 xff0c 这里记录一下 xff0c 主要集中在ROS系统安装问题的解决 Ubuntu系统的
  • ELK---Python实现Mysql数据导入到ES,及Geoip数据类型写入

    使用环境 Python3 6 准备Py包 elasticsearch geoip2 pymysql 下面上代码 1 导入必要的模块 encoding utf 8 from elasticsearch import Elasticsearch