用python导入20个G的json数据到Mysql数据库

时间:2022-06-30 16:24:56

整体思路参考资料:https://blog.csdn.net/layman2016/article/details/79252499

作业:有一个16个G的跟疫情相关的json新闻大数据(article.txt),用python3将导入到数据库Mysql5.7,然后用可视化工具(我用的是R)对这些数据进行可视化

提供了数据字典,对字段有详细的说明

用python导入20个G的json数据到Mysql数据库

还有一个article_demo.csv

用python导入20个G的json数据到Mysql数据库

说明:1.由于json数据太大,需要用json.loads()一条一条的解析,然后再插入到Mysql数据库中

2.数据量大,导入Mysql数据库速度太慢,一开始导了一遍需要4个小时+,经过调整mysql的my.ini参数设置时间缩为10分钟左右

3.当然也可以导出到csv,然后进行可视化也行,但是不利于后续对数据的操作,导出导入等。所以选择导入到数据库,方便练习简单的sql操作;当然导入到数据库会出现很多细节问题,对于新手也是一个练习的机会

结果:最终导入成功40万+条数据,舍弃了因清洗问题和其他报错问题的5万+条数据,基本满足可以完成作业的要求。

全部代码如下:(整体思路跟layman2016一致)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import jsonimport pymysql #创建表格
def prem(db):
cursor = db.cursor() #调用操作游标
cursor.execute("SELECT VERSION()") #使用exectue执行SQL语句
data = cursor.fetchone() #使用fetchone获取一条数据
print("Database version : %s " % data) # 结果表明已经连接成功
cursor.execute("DROP TABLE IF EXISTS article") # 检查一下有没有同名,有则删除
#19个字段
sql = """CREATE TABLE article (
content varchar(8000),title varchar(100),appName varchar(20),
catLabel2 varchar(50),sourceRegion varchar(50),copyDate varchar(20),spamLabel varchar(40),
appCode varchar(50),spamCode int,sourceType varchar(50),sentimentDistTitle_confidence float(8,6),
sentimentDistTitle_positive float(8,6),sentimentDistTitle_negative float(8,6),
id varchar(100), sentimentDist_confidence float(8,6),sentimentDist_positive float(8,6),sentimentDist_negative float(8,6),
publishDate varchar(20),url varchar(1000)
)ENGINE=MyISAM default charset=utf8""" #更换引擎,提高插入速度 cursor.execute(sql) # 根据需要创建一个表格 def article_insert(db):
with open('E:/json_article/article.txt', encoding='utf-8') as f:
i = 0
error = 0
line = f.readline() # 使用逐行读取的方法
while line:
i += 1
if i%10000==0:
print("count is ",i)
try:
line = f.readline()
article_text = json.loads(c,strict=False) # 解析每一行数据,strict防止Invalid control character
#print(c) #19个
insert_re = "insert into article(content,title,appName,catLabel2,sourceRegion,copyDate,spamLabel,appCode,spamCode,sourceType,sentimentDistTitle_confidence,sentimentDistTitle_positive,sentimentDistTitle_negative,id,sentimentDist_confidence,sentimentDist_positive,sentimentDist_negative,publishDate,url) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" result = []
result.append((article_text["content"],article_text["title"],article_text["appName"],
article_text["catLabel2"], article_text["sourceRegion"],article_text["copyDate"],article_text["spamLabel"],
article_text["appCode"],article_text["spamCode"],article_text["sourceType"],
article_text['sentimentDistTitle']['confidence'],article_text['sentimentDistTitle']['positive'],article_text['sentimentDistTitle']['negative'],
article_text['id'],article_text['sentimentDist']['confidence'],article_text['sentimentDist']['positive'],
article_text['sentimentDist']['negative'], article_text['publishDate'],article_text["url"]))
#print(result)
#print(type(result)) cursor = db.cursor()
cursor.executemany(insert_re,result) db.commit() except Exception as e:
error = error+1
#print(str(e))
continue
except UnicodeDecodeError as e:
error = error+1 #解决,直接忽略问题:utf-8 codec can't encode characters in :Invalid control character
#print(str(e))
continue
line = f.readline()
print("count is ",i,"error is ", error) if __name__ == "__main__": # 起到一个初始化或者调用函数的作用
db = pymysql.connect("localhost", "root", "******", "test", charset='utf8') #连接数据库test
cursor = db.cursor()
prem(db)
article_insert(db)
print('success')
cursor.close()

第一部分 创建表格 def prem(db)

首先需要在Mysql数据库里面先创建数据库test,然后调用sql语句创建表格article。

db.cursor() 其实就是用来获得python执行Mysql命令的方法,也就是操作游标

cursor.execute()执行sql语句

fetchone()则是接收返回结果行;fetchall()则是接受返回结果的多行记录

--参考fetchone和fetchall的介绍 https://blog.csdn.net/JackLiu16/article/details/78877460

如果对Mysql数据库语句和数据类型比较熟悉,可以直接在python里面直接创建表格;

如果不熟悉,建议在数据库创建好,因为Mysql里面的error code 比较详细,方便修改错误。

第二部分 数据插入  article_insert(db)

先用readline()逐行读取json数据

然后用json.loads()解析数据

--进一步理解区分load()和loads(),dump()和dumps()参考 https://www.cnblogs.com/bigtreei/p/10466518.html

再用executemany()同时执行多条语句,执行同样多的语句比execute()快很多

--参考executemany()和execute()的区别和应用https://www.cnblogs.com/zeke-python-road/p/9442152.html

														
		

用python导入20个G的json数据到Mysql数据库的更多相关文章

  1. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

  2. JSON文件存入MySQL数据库

    目标:将不同格式的JSON文件存入MySQL数据库 涉及的点有: 1. java处理JSON对象,直接见源码. 2. java.sql.SQLException: Incorrect string v ...

  3. node.js存json数据到mysql

    众所周知,mysql是无法存储json数据的,这个刚开始笔者也是知道的,也知道JSON.stringify()这个API的,但是当我真正要这样做利用JSON.stringify()讲要转换的JSON数 ...

  4. Python爬取招聘信息,并且存储到MySQL数据库中

    前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...

  5. Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:

    创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...

  6. 飘逸的python - 命令行漂亮的显示json数据

    之前做的一个脚本把信息用json格式存到文本中.这样的好处是简便,易编辑,并且拥有强大的表达能力. 不过从文本cat出来的是一堆很难看的字符串,没换行和缩进.这时候就在想,如果有个类似于IDE的格式化 ...

  7. Python web后端接收到的json数据有前端格式的布尔值 true false

    最近在后端处理前端传过来的json数据,发现,因为数据是各种数据格式的嵌套,使用json.loads(),无法将内层的数据转换为原来格式的数据,所以需要使用eval( )函数进行转换,但是如果数据含有 ...

  8. MOOC(3)- python发送请求,返回的json数据被转码

    https://www.cnblogs.com/yoyoketang/p/10339210.html 问题:发送post请求,对post请求返回的json数据格式化,但是返回的结果被转码了 json. ...

  9. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

随机推荐

  1. docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用

    .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...

  2. OpenGL 4.5 Core Profile管线(GLSL与应用程序接口详解)【未完成】

    之前写过一篇博客,OpenGL管线(用经典管线代说着色器内部),说的主要是OpenGL的经典管线.大家都知道,现代OpenGL已经弃用(从OpenGL 3.0开始)经典管线功能(glBegin,变换矩 ...

  3. Map笔记总结

    Map :存储的是键值对,一对一对出现的,要保证键的唯一性. Map常见的三个子类.1.HashTable 底层是哈希表结构,不能存在null的情况.该集合是线程同步的.效率低此类实现一个哈希表,该哈 ...

  4. 获取集合、数组后要判断为空的必要性以及根据构造器创建对象后不是null的证实

    在开发过程中,凡是获取到一个集合对象,在利用或者说遍历这个集合对象之前,都要进行是否为null以及size()>0的判断,但是如果size()>0的话,不是就已经可以说明此集合对象不为nu ...

  5. 20165308『网络对抗技术』Exp5 MSF基础应用

    20165308『网络对抗技术』Exp5 MSF基础应用 一.原理与实践说明 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实 ...

  6. phpcms 自定义方法

    路径:\install_package\phpcms\libs\functions\extention.func.php <?php //输入栏目ID获取父级栏目名称 function catp ...

  7. Shell - 简明Shell入门14 - 操作符(Operator)

    示例脚本及注释 #!/bin/bash echo "No code, just some comments." # ### 通配符 # * 代表任意(0个或多个)字符 # ? 代表 ...

  8. Java&lowbar;myBatis&lowbar;全局配置文件

    mybatis主要需要配置的项: 1.properties  配置文件的“环境变量”键值对 2.typeAliases  输入输出数据的类型 3.mappers  映射配置文件 下面看看实例: &lt ...

  9. hdu 1116 欧拉回路&plus;并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...

  10. 在Mac上用bootcamp安装windows,使用Android studio启动模拟器时蓝屏问题的解决方法

    原链接 https://medium.com/@andrea.bresolin/windows-10-on-mac-with-boot-camp-making-intel-haxm-work-with ...