python学习之路:python连接阿里云ODPS
前言
本人最近在学习使用ODPS,希望把学习过程记录下来,方便自己查阅。
1、安装ODPS
pip install ODPS
2、连接阿里云odps
确认下载好后,连接odps,账号密码自备。
from odps import ODPS
o = ODPS(
access_id='user', #登陆账号
secret_access_key='password', #登陆密码
project='project', #odps上的项目名称
endpoint='http://service.cn-hangzhou-xxx:80/api') #官方提供的接口
3、执行sql
3.1、简单执行sql
with o.execute_sql('desc tablename').open_reader() as reader:
print(reader.raw)
3.2、通过odps内置DataFrame读取,该方法读取的数据结构类型为odps.df.expr.core.DataFrame
def get_odps_table(tb_name):
data = DataFrame(o.get_table(tb_name))
data['ds'] = data['ds'].astype('int')
return data
rdata = get_odps_table('tb_name') #获取表数据实例
3.3、封装成函数连接
直接输入sql就可进行增删改查
def exe_sql(sql):
from datetime import datetime
import pandas as pd
st_time = datetime.now()
data = []
with o.execute_sql(sql).open_reader() as reader:
d = defaultdict(list) # collection默认一个dict
# 解析record中的每一个元组,存储方式为(k,v),以k作为key,存储每一列的内容;
for record in reader:
for res in record:
d[res[0]].append(res[1])
data = pd.DataFrame.from_dict(d, orient='index').T # 转换为数据框,并转置,不转置的话是横条数据
ed_time = datetime.now()
print('总耗时:', ed_time - st_time ) # 输出sql运行时间,方便sql修改、维护
return data
4、将sql结果转换为excle
test = exe_sql('输入sql')
test.to_excel('./表名', index=False, encoding='gbk')
5、遇到的问题
问题1: 假如每天要执行同一个sql,并将输出的datafram进行merge操作,那么遇到sql跑出的数据为空时,就回发现merge报错。因为merge无法合并空的datafram,至少需要列名信息和合并主列名。
Empty DataFrame
Columns: []
Index: []
解决方案1:每次执行完sql,进行一个空值判断,判断sql是否为空
解决方案2:全部写一个sql里面,但是修改麻烦
相关链接
Python3 读取odps数据库数据_uuddoop的博客-CSDN博客_odps数据库