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 安全设置的限制)。
'''

  

 
 

3.sql的更多相关文章

  1. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  2. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  3. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  4. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  5. EntityFramework Core Raw SQL

    前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...

  6. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...

  7. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  8. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  9. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  10. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

随机推荐

  1. Java 泛型 二

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  2. React + webpack 快速搭建开发环境

    因网上大多React + webpack快速搭建的运行不起来,便自行写了一个.在搭建开发环境的前需安装nodejs,npm. 新建一个工作目录,比如叫reactdome,在reactdome目录中运行 ...

  3. LDAP操作的两种方案

    最近由于项目需要研究了一下LDAP相关知识,感觉对没接触过的人来说还是有点坑的,所以记录下来给大家分享. 由于是第一次接触,就在网上搜了一些相关的文章,照着示例代码测试,却怎么也连不上LDAP服务器, ...

  4. Jenkins拾遗--第五篇-git插件填坑

    Jenkins使用过程中,大部分Job的第一项就行从源码库里签出代码.由于git越来越流行,所以,稍微新一些的项目的源码管理都是基于git的.对应的,jenkins的git plugin几乎是大部分j ...

  5. 【The VC Dimension】林轩田机器学习基石

    首先回顾上节课末尾引出来的VC Bound概念,对于机器学习来说,VC dimension理论到底有啥用. 三点: 1. 如果有Break Point证明是一个好的假设集合 2. 如果N足够大,那么E ...

  6. mongodb安装和配置三步走

    最近在重新学习node,所以和同事一起搞了个模仿新浪微博的项目,项目刚开始,所以其他的东西就暂时先不提.这里介绍下mongodb的安装.直接搜索可以看到很多介绍,但是我第一次是失败了,不过看了好几个还 ...

  7. eclipse进阶功法

    先选择要操作的行,在同时按shift+alt+a,会将所选中的文字括起来,鼠标会变成十字图标,按住鼠标左键,在相应输入文字的位置上下拖动,会出现一个竖杠,此时即可开始输入文字了,并且所选中行都有.

  8. [译]16-spring基于注解的配置元数据

    从spring2.5起spring框架开始支持java注解的配置元数据.所以除了使用xml配置文件来描述bean的装配之外,你还 可以使用基于java注解的配置元数据来完成同样的功能. spring框 ...

  9. windows版本cloudbase-init流程说明

    源码流程说明 - 程序首先判断操作系统类型,加载对应的模块 - 加载服务,服务共分为四种: 'cloudbaseinit.metadata.services.httpservice.HttpServi ...

  10. 1020 Tree Traversals (25 分)(二叉树的遍历)

    给出一个棵二叉树的后序遍历和中序遍历,求二叉树的层序遍历 #include<bits/stdc++.h> using namespace std; ; int in[N]; int pos ...