通过上篇博客讲到Gbase和mysql的兼容性,而且之前有使用过flask+echarts+mysql做大屏数据可视化。现在把mysql改为Gbase看是否能够做大屏数据可视化。
1. 使用python脚本采集数据时,运行后报错如图所示:
这种情况如果是在mysql的话,解决的办法时间把版本降下来,使用pymysql - 0.9.3 和SQLAlchemy - 1.3.4这个版本。但是在Gbase8a上不管是降低版本还是升级版本,都是报这个错误而无法使用。原因应该是gbase8a不支持to_sql这个函数功能。给这个项目开发带来一定的难度和不便。
2. 不能使用to_sql
就必须要先创建表结构,选择在Gbase8a里建表是避免在采集脚本要做是否判断有表的存在,节省资源。不自动创建表,否则无法把数据写入到Gbase8a数据库里。在运行插入shares_l1这张表时,报错如图所示:
代码如下:
import pandas as pd
import numpy as np
import pymysql
from sqlalchemy import create_engine
pymysql.install_as_MySQLdb()
con_engine = pymysql.connect(host='kafka1.wuyi.com',user='root',password='xxxx',database='shares',charset='utf8mb4',port=5258)
engine = create_engine('mysql+pymysql://root:xxxx@kafka1.wuyi.com:5258/shares')
sql1 = "select * from shares_basic;"
da0 = pd.read_sql(sql1 , con_engine)
cursor = con_engine.cursor()
# shares_l1
# 涨幅大的前top5
da16 = da10[['name','up','day']].sort_values('up', ascending = False).head(5)
da16['day']=da10['day']
# da16.to_sql('shares_l1',engine,if_exists='append')
sql = '''insert into shares_l1(name,up,day) values('%s','%s','%s')'''
for k in range(len(da16)):
cursor.execute(sql % (da16['name'][k], da16['up'][k], da16['day'][k]))
con_engine.commit()
修改方法是在da16 = da10[[‘name’,‘up’,‘day’]].sort_values(‘up’, ascending = False).head(5)的下面一行添加下面这条命令这可。
da16 = da16[[‘name’,‘up’]].groupby([‘name’])[‘up’].mean().reset_index(name = ‘up’)
原因是数据来源有index索引,做了排序后,无法做写入gbase里,对top5de 股票做平均值,不会改变数值,只会改变表的索引结构,便于写入到gbase里。
3. 在项目里要在utils.py里修改数据库的连接
如果之前是连接mysql的,要修改用户名,密码,字符集和端口。代码如下:
# 连接数据库
def get_conn():
conn = pymysql.connect(
host="kafka1.wuyi.com",
user="root",
password="xxxx ",
database="shares",
charset="utf8mb4",
port=5258
)
# 创建游标:
cursor = conn.cursor()
return conn, cursor
4. 修改后运行程序
能正常运行,但是后台获取数据异常,有丢失数据和重复插入数据的问题,导致数据可视化展示出现有些指标没有获取数据和有些指标重复。 原因是使用采集数据是每3秒采集一次,而处理数据时间长,再使用for循环进行行插入,这样会造成数据丢失和重复的情况。测试修改每隔2分钟采集一次还是会出现这种情况。尝试过在values后面,设置单行插入是没有问题。但是插入多行会报错。
之前看过论坛有人说过Gbase8a能兼容mysql百分之九十,但是通过对这次的的实例操作,我发现不支持to_sql就是那不兼容的百分之十,虽然能使用for循环插入批量数据,但是这消耗过多资源,会导致Gbase8a不适用于实时应用场景,更确切的说是不适应于写入数据的场景,读取的数据场景没有问题。希望Gbase8a的开发团队能开发支持to_sql或类似to_sql的功能,便于开发者通过Gbase8a数据库来开发实时应用场景。
这个是我使用Gbase8a做出的效果图,因服务器在3月26号已经到期,无法做实时的展示。