使用python从Redshift下载数据
前置工作
1、 注册使用AWS服务
2、 创建Redshift服务
3、 配置VPC服务
4、 配置安全组
5、 使用Redshift
正文
最近遇到一个工作中的问题,需要将Redshift中的数据和第三方的应用进行数据打通,以下是分析思路
1、最好是第三方应用直接可以从Redshift上通过请求获取数据,但是还没有想好方法,所以退而求其次,先将Redshfit上的数据下载到本地,而后再看本地和第三方应用同步。
2、其次,在官方文档中,建议使用S3的服务,使用COPY命令往Redshift中插入数据而不是使用Redshift中的insert。原因在于使用S3的服务,效率会得到大幅度提升,同时S3的存储空间也会占更少的存储资源。
以下是根据官方文档对Redshift进行操作的代码片段
import csv
import pandas as pd
import codecs
import time
import redshift_connector
class PyRedshift:
def __init__(self,db='dev',table='a'):
pass
# self.db = input('请输入你想创建的数据库名称: ')
# self.db = 'dev'
# self.table = input('请输入你想创建的表名称: ')
# 连接数据库
def conn_redshift(self):
conn = redshift_connector.connect(
host='yourhost',
database='yourdb',
user='yourname',
password='yourpwd'
)
return conn
# 创建数据库
# def create_db(self, cur):
# db = cur.cursor() # 创建光标
# db.execute("create database if not exists {} character set utf8;".format(self.db))
# db.execute("use {};".format(self.db)) # 切换至改数据库
# cur.commit() # 一定要进行事务更新
# print('创建数据库成功')
# return cur
# 创建表
def create_table_head(self, db, head):
sql = 'create table if not exists {}('.format(self.table) # 创建表
for i in range(0, len(head)):
sql += '{} varchar(100)'.format(head[i])
if i != len(head) - 1:
sql += ','
sql += '\n'
sql += ');'
cur = db.cursor() # 创建光标
cur.execute(sql) # 执行命令
db.commit() # 一定要进行事务更新
time.sleep(0.1)
print('创建表完成')
# 插入数据
def insert_table_info(self, db, info):
sql = 'insert into {} values ('.format(self.table)
for i in range(0, len(info)):
sql += "'{}'".format(info[i])
if i != len(info) - 1:
sql += ','
sql += ');'
print(sql)
try:
cur = db.cursor()
cur.execute(sql)
db.commit() # 一定要进行事务更新
time.sleep(0.1)
print('插入数据成功')
except Exception as e:
print('插入数据失败,失败原因', e)
# 创建表所需要的字段
def table_head(self, filename):
with codecs.open(filename=filename, mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
head = next(reader)
print(head)
return head
# 表需要的数据
def table_info(self, db, filename):
with codecs.open(filename=filename, mode='r', encoding='utf-8') as f:
data = csv.reader(f)
for index, rows in enumerate(data):
if index != 0: # 不要首行
row = rows
print(row)
self.insert_table_info(db, row)
# 下载数据至本地
def table_load(self,db,filename):
cur = db.cursor()
table = input('请输入你想下载的表名称: ')
rows = input('请输入你想下载的行数: ')
try:
sql = "select * from {} limit {}".format(table,rows)
# re = cur.execute(sql)
# columns = [str(col[0],'utf-8') for col in re.description]
# print(columns)
# result = re.fetchall()
# print(result)
# with open(filename,mode='w',encoding='utf-8') as f:
# write = csv.writer(f,dialect='excel')
# for re in result:
# # print(re)
# write.writerow(re)
data_csv = pd.read_sql(sql,db)
data_csv.to_csv(filename)
print('输出完成')
# print(result)
except Exception as e:
print("查询表不存在,请重新输入")
if __name__ == '__main__':
pysql = PyRedshift()
conn = pysql.conn_redshift() # 连接redshift数据库
# db = pysql.create_db(conn) # 创建数据库
# filename = 'C:\Users\17621\Desktop\air.csv'
# 插入数据的文件
# head = pysql.table_head(filename) # 创建表需要的字段
# pysql.create_table_head(conn, head) # 创建表
# pysql.table_info(conn, filename) # 插入数据
pysql.table_load(conn,'mindao2.csv')
下期,将看一看如何使用Python接入S3和本地进行数据交互。 官方文档