本文为您介绍PyODPS的常见问题。

PyODPS节点是否支持Python 3?

支持。详情请参见创建PyODPS 3节点

使用PyODPS统计表中某个字段的空值率时,用EXECUTE_SQL还是DataFrame,哪个性能更高?

DataFrame聚合性能更高,推荐您使用DataFrame执行聚合操作,详情请参见聚合操作

如何使用PyODPS下载全量数据?

PyODPS默认不限制从Instance读取的数据量。但是对于受保护的项目,您通过Tunnel下载数据将受限。此时,如果未设options.tunnel.limit_instance_tunnel,系统会自动打开数据量限制,可下载的数据量受项目限制,通常为10000条。如果您需要手动限制下载的数据量,可以通过open_reader方法增加LIMIT选项,或设置options.tunnel.limit_instance_tunnel=True

通过PyODPS的DataFrame处理数据时,资源是如何使用的?

只有MaxCompute的对象才会调用MaxCompute资源。通过PyODPS的DataFrame处理数据时,使用MaxCompute的分布式计算能力,系统会将数据提交至MaxCompute集群,调用MaxCompute资源进行计算。执行df操作会使用到内存,例如下载数据。

如何确定PyODPS运行在服务端还是客户端?

在使用PyODPS会出现对内存和数据大小的限制,但这些并非是PyODPS的限制,其本质是对客户端DataWorks PyODPS节点的限制,而PyODPS运行在服务端对内存和数据的大小是没有限制的,但是很多人无法确定PyODPS到底是运行在服务端还是客户端。
  • 发生在客户端的行为
    PyODPS在客户端运行有以下三种情况:
    • 情况一:PyODPS DataFrame转化成pandas的DataFrame。
    • 情况二:SQL执行时在服务端,将结果进行遍历时在客户端。
      代码示例如下。
      result = o.execute_sql('select * from my_new_table;',hints={'odps.sql.allow.fullscan': 'true'})
      with result.open_reader() as reader:    
          for record in reader:            
              print record[0],record[1]
    • 情况三:head()tail()等查看结果的函数。
  • 发生在服务端的行为

    判断PyODPS运行在服务端的标准是代码是否可以编译成SQL运行。如果代码最终编译成SQL运行,则PyODPS运行在服务端。

    PyODPS在服务端运行有以下三种情况:
    • 情况一:直接使用SQL语句执行。
      result = o.execute_sql('select * from my_new_table;',hints={'odps.sql.allow.fullscan': 'true'})
    • 情况二:代码转化成PyODPS的DataFrame并使用PyODPS DataFrame的算子。PyODPS DataFrame做运算的算子最终会编译成SQL执行。
    • 情况三:DataFrame使用用户自定义函数处理数据。用户自定义函数最终也会编译成SQL执行。