from odps import ODPS
o = ODPS(access_id="LTASVb3aOF3ghjek",
         secret_access_key="FeUozVDFSvtEgcpzPUZHIT9vyWyX7W",
         project="satori",
         endpoint="http://service.odps.aliyun.com/api")

'''
pyodps支持odps sql的查询,并可以读取执行的结果。
execute_sql或者run_sql方法,返回一个运行实例
但并非所有在ODPS Consol 中可以执行的命令都是 ODPS 可以接受的 SQL 语句。

o.execute_sql()  会同步执行,直到查询完成
o.run_sql()   会异步执行
'''
# 注意:一般情况下,不建议直接使用select *
# 所以要使用的话,需要指定分区
# 同步的方式执行,会阻塞
instance = o.execute_sql("select * from girls where pt='test'")
print(instance)

<Instance 20180826051816538gg3l6392>

  

# 异步的方式执行
instance = o.run_sql('select * from girls where pt="test"')
# 获取logview的地址
print(instance.get_logview_address)
<bound method Instance.get_logview_address of <Instance 20180826052031717gd48148>>

  

# 阻塞直到完成
instance.wait_for_success()

  

with instance.open_reader() as reader:
    for record in reader:
        print(dict(record))

  # 输出

 

{'name': '椎名真白', 'age': 16, 'anime': '樱花庄的宠物女孩', 'pt': 'test'}
{'name': '雨宫优子', 'age': 16, 'anime': '悠久之翼', 'pt': 'test'}
{'name': '宫村宫子', 'age': 17, 'anime': '悠久之翼', 'pt': 'test'}
{'name': '四方茉莉', 'age': 400, 'anime': 'sola', 'pt': 'test'}
{'name': '森宫苍乃', 'age': 17, 'anime': 'sola', 'pt': 'test'}
{'name': '牧濑红莉栖', 'age': 20, 'anime': '命运石之门', 'pt': 'test'}
{'name': '椎名真由理', 'age': 18, 'anime': '命运石之门', 'pt': 'test'}
{'name': '漆原琉华', 'age': 18, 'anime': '命运石之门', 'pt': 'test'}
{'name': '春日野穹', 'age': 17, 'anime': '缘之空', 'pt': 'test'}
{'name': '坂上智代', 'age': 19, 'anime': 'clannad', 'pt': 'test'}
{'name': '古河渚', 'age': 20, 'anime': 'clannad', 'pt': 'test'}
{'name': '立华奏', 'age': 17, 'anime': 'AngelBeats', 'pt': 'test'}
{'name': '和泉纱雾', 'age': 16, 'anime': '埃罗芒阿老师', 'pt': 'test'}
{'name': '宫园薰', 'age': 17, 'anime': '四月是你的谎言', 'pt': 'test'}
{'name': '秋月爱莉', 'age': 16, 'anime': '鬼父', 'pt': 'test'}

--------------------------------------------------------------

# 当然在运行的时候,可以通过hints设置参数
# o.execute_sql('select * from girls', hints={'odps.sql.mapper.split.size': 16})

# 或者设置sql.settings,每次运行自动添加
# from odps import options
# options.sql.settings = {'odps.sql.mapper.split.size': 16}
# o.execute_sql('select * from girls') # 会根据全局配置添加hints

# 也可以直接读取sql执行结果
with o.execute_sql("select * from girls where pt='test' limit 5").open_reader() as reader:
    for record in reader:
        print(f"my name is {record.name}, age is {record['age']}, come from {record[2]}")

  

# 输出

my name is 椎名真白, age is 16, come from 樱花庄的宠物女孩
my name is 雨宫优子, age is 16, come from 悠久之翼
my name is 宫村宫子, age is 17, come from 悠久之翼
my name is 四方茉莉, age is 400, come from sola
my name is 森宫苍乃, age is 17, come from sola
'''
如果 options.tunnel.use_instance_tunnel == True,
调用 open_reader 时,PyODPS 会默认调用 Instance Tunnel,
否则会调用旧的 Result 接口。
如果使用了版本较低的 MaxCompute 服务,或者调用 Instance Tunnel 出现了问题,
PyODPS 会给出警告并自动降级到旧的 Result 接口
可根据警告信息判断导致降级的原因。
如果 Instance Tunnel 的结果不合预期, 请将该选项设为 False
在调用 open_reader 时,也可以使用 tunnel 参数来指定使用何种结果接口
'''
with o.execute_sql("select * from girls where pt='test' limit 5").open_reader(tunnel=True) as reader:
    for record in reader:
        print(f"my name is {record.name}, age is {record['age']}, come from {record[2]}")
print("--------------------------------------------")
with o.execute_sql("select * from girls where pt='test' limit 5").open_reader(tunnel=False) as reader:
    for record in reader:
        print(f"name = {record.name}, age = {record['age']}, anime = {record[2]}")

  

my name is 椎名真白, age is 16, come from 樱花庄的宠物女孩
my name is 雨宫优子, age is 16, come from 悠久之翼
my name is 宫村宫子, age is 17, come from 悠久之翼
my name is 四方茉莉, age is 400, come from sola
my name is 森宫苍乃, age is 17, come from sola
--------------------------------------------
name = 椎名真白, age = 16, anime = 樱花庄的宠物女孩
name = 雨宫优子, age = 16, anime = 悠久之翼
name = 宫村宫子, age = 17, anime = 悠久之翼
name = 四方茉莉, age = 400, anime = sola
name = 森宫苍乃, age = 17, anime = sola
'''
PyODPS 默认不限制能够从 Instance 读取的数据规模。
对于受保护的 Project,通过 Tunnel 下载数据受限。
此时, 如果 options.tunnel.limit_instance_tunnel 未设置,会自动打开数据量限制。
此时,可下载的数据条数受到 Project 配置限制, 通常该限制为 10000 条。
如果你想要手动限制下载数据的规模,可以为 open_reader 方法增加 limit 选项,
或者设置 options.tunnel.limit_instance_tunnel = True 。
如果你所使用的 MaxCompute 只能支持旧 Result 接口,同时你需要读取所有数据,
可将 SQL 结果写入另一张表后用读表接口读取 (可能受到 Project 安全设置的限制)。
'''

  

 
 

最新文章

  1. asp.net生成随机密码
  2. CSS3-html,样式与样式表的创建,选择器
  3. Windows对象操作:浏览器窗口信息
  4. Bill Gates说..
  5. JavaSE复习_10 多线程复习
  6. robots.txt用法
  7. MIPI-1
  8. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
  9. C#中级-通过注册表读取Windows Service程序执行路径
  10. C#数据缓存介绍及Caching通用帮助类整理
  11. XP .Net 4.0使用Microsoft.Bcl需要安装XP补丁NDP40-KB2468871-v2-x86
  12. 关闭win10一切
  13. windows下python虚拟环境virtualenv安装和使用
  14. Git 审查更改
  15. 九. Python基础(9)--命名空间, 作用域
  16. Pro Git读书笔记 - 分支
  17. STL标准库-仿函数与仿函数适配器
  18. 迷你MVVM框架 avalonjs 0.92发布
  19. java中接口的定义
  20. C++学习笔记--名称空间

热门文章

  1. IE浏览器调用ActiveX获取U盘中的文件
  2. 13,SQLAlchemy 增删改查 一对多 多对多
  3. \r \r\n \t的区别
  4. 绑定host域名 修改手机hosts域名
  5. 我给女朋友讲编程CSS系列(4) CSS盒子模型
  6. 使用Visual Studio 快速把 Json,Xml 字符串创建为一个实体类
  7. 每天一个Linux命令(5):rm命令
  8. NodeJs02 美女爬虫
  9. 重复造轮子系列--字符串处理(C语言)
  10. 201621123034 《Java程序设计》第14周学习总结