python连接redshift进行数据下载

516 阅读3分钟

使用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和本地进行数据交互。 官方文档