大数据时代,对数据的采集,处理,需要效率和成本。解决方案从来都不是唯一的,只有是否合适的。目前在学python,就记录一些python相关的知识吧。大数据的状况,可以看阿里云栖社区 https://yq.aliyun.com/
在统计数据的时候,要对数据进行分析。在不破话原始数据以及对原始服务器的多次请求。可以将原始数据保存一份到其他数据库或文件中。这个中间你可以做处理以及优化,比如排重,去掉某些自己认为定义的无效数据等。然后,对这些数据,你可以进行多次的操作分析处理。
于是,操作数据库就很必要了。SQLAlchemy是python的一个框架,利用它可以将相对应的数据库(mysql等)中的数据读取出来,还可以将数据写入数据库。中间经常用到的有.csv文件或DataFrame数据。
在干干净净的电脑上,你调用的时候,可能缺少相应的库,这个时候你需要先装好。
先说下将mysql中的数据保存为本地csv文件。
1,导入SQLAlchemy,创建engine。
from sqlalchemy import Column, String, create_engine # 初始化数据库连接: engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
只需要将拼凑好的字符串丢过去就行。字符串每一段分别对应着:数据库用户名,数据库密码,数据库host,数据库port,数据库名。你还可以传其他参数,比如编码方式。
2,编写sql语句。
sql = "s-e-l-e-c-t uid, nickname, age, city, pay from accounts where date >= '2016-10-10 00:00:00' and date <'2016-10-11 00:00:00'"
3,通过pandas的read_sql方法调用sql和engine,将数据库中的数据转换成DataFrame。然后,调用DataFrame的to_csv方法,将DataFrame写入到本地的csv文件中。
name = 'test.csv' sql = "s-e-l-e-c-t uid, nickname, age, city, pay from accounts where date >= '2016-10-10 00:00:00' and date <'2016-10-11 00:00:00'" df = pd.read_sql(sql, engine) df.to_csv(name, index=False, encoding='utf-8')
这样,mysql保存到csv的流程已经走完。
下边,再说下,将本地csv文件保存到mysql中。
1,导入SQLAlchemy,创建engine。使用同上。
2,创建SQLAlchemy的declarative_base对象。declarative_base作为父类,建立一个子类继承它,然后在子类中,填充需要定义的字段名。这些字段,可以手动在mysql中创建。因为刚接触,也许,可以自动创建。code如下。
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import PrimaryKeyConstraint, Column, Integer, Date, SmallInteger Base = declarative_base() class UserEnterChannelTime(Base): __tablename__ = "cq_accounts" day = Column(Date, primary_key=True) uid = Column(Integer, nullable=False) channel_id = Column(Integer, nullable=False) in_channel_time = Column(Integer, nullable=False)
2,调用engin的begin方法,获取到conn,然后调用conn的excute方法。这种方式和websql操作数据库的方式很相像。
engine = 'xxxxx' conn = engine.begin() conn.execute(UserEnterChannelTime.__table__.insert, day = '2016-10-18 19:45:00', uid = 2331024, channel_id = 882, in_channel_time = 2.4)
这里,你也可以填入list。python就是那么自由。
除了上边的方法写入本地csv文件,还有一种方法。用csv库。就是写入数据,写入一行,writerow,写入多行writerows。一行就是个一维集合,多行可以是二维集合。
# coding: UTF-8 import pandas as pd import numpy as py import csv dates = pd.date_range('20161018', periods=100) df = pd.DataFrame(py.random.randn(100, 3), index=dates, columns=list('ABC')) with open('test.csv', 'wb') as csvfile: spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(df.columns) #写入字段 spamwriter.writerows(df.values) #写入多行
突然想到一个无关这个的问题。为了效率,相同类型数据可以存在numpy的array中。numpy的array有这样的特性,里边存的是相同类型的数据,这样方便处理以及速度。因为同一类型数据,有着同样的方法和属性。