什么是PyODPS DataFrame

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 这篇文章解释了PyODPS DataFrame是什么,能做什么事情,以及简单介绍一下实现的原理。

最近已经写了几篇有关PyODPS DataFrame的文章,但是还是有些同学不明白PyODPS DataFrame是什么,以及能做什么事情。这篇文章,我会做出解释,以及简单介绍一下实现的原理。

PyODPS DataFrame

首先什么是DataFrame,我在以前的文章也解释过,我们可以把它认为是二维表结构。在单机上,数据科学家一般会使用R或者Python库pandas来做数据分析,DataFrame是它们上广泛使用的数据结构。在DataFrame上,我们可以做过滤、列筛选、join、union等等操作。

因此,DataFrame也常常拿来和SQL做比较。我觉得主要的区别有:

  • 可能每个系统都有自己的SQL语法,但是对于DataFrame来说,可以把一套语法应用到不同的系统中,也就是说,各个系统上层的DataFrame语法可以是一致的。
  • DataFrame可以和本身的实现语言相关,因此能用到语言相关的特性,变量赋值、和语言三方库集成等等都不在话下。

因此从第一点上来说,就能解释为什么我们的PyODPS DataFrame能在ODPS和本地上执行了。同样的语法,灵活性很高。

对于PyODPS DataFrame来说,什么时候数据在MaxCompute上执行,什么时候在本地执行呢?这和用户的初始输入有关。当用户用MaxCompute表来初始化DataFrame的时候,后续计算就会在MaxCompute上执行。

In [5]: iris = DataFrame(o.get_table('pyodps_iris'))

In [6]: iris[iris.sepalwidth < 4].head(3)
|==========================================|   1 /  1  (100.00%)        19s
Out[6]: 
   sepallength  sepalwidth  petallength  petalwidth         name
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa

比如例子里,我们用一张MaxCompute表来初始化,因此后续的计算都是在MaxCompute上执行的。而如果用pandas DataFrame来初始化,那么后续的计算就是在本地执行。

我们前面一篇文章提过,我们从0.4版本开始带来一个特性,我们能join SQL和本地数据时,具体是怎样实现的呢?其实很简单,我们先把本地数据都计算完成,然后通过Tunnel上传到ODPS,再执行ODPS上的计算。

在ODPS上计算时,和本地的计算能力是无关的,除非获取最终计算结果,数据也不会放在本地。

对于在ODPS上的计算,目前来说,我们绝大多数的操作会使用ODPS SQL执行,但有部分情况,我们会使用tunnel执行,以提高执行速度。这些包括:

  • 对原始表筛选字段
  • 非分区表的切片,或分区表不选取分区或者选取前几个分区字段的切片
  • 非分区表取条数总数,或分区表选取分区的条数总数

举个例子,我们的pyodps_iris是个非分区表,以下情况会使用tunnel,而不是转化成SQL执行。

In [7]: iris.count()
|==========================================|   1 /  1  (100.00%)         0s
150

In [10]: iris.exclude('name')[:3]
|==========================================|   1 /  1  (100.00%)         0s

   sepallength  sepalwidth  petallength  petalwidth
0          5.1         3.5          1.4         0.2
1          4.9         3.0          1.4         0.2
2          4.7         3.2          1.3         0.2

可以看到,使用Tunnel的计算是很快的。因此,我们可以利用这个特性来从ODPS上下载少量数据,来利用本地计算来做debug。

In [6]: iris[iris.sepalwidth < 4].head(3)  # 利用ODPS计算时,对小数据量是没有优势的
|==========================================|   1 /  1  (100.00%)        19s
Out[6]: 
   sepallength  sepalwidth  petallength  petalwidth         name
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa

In [11]: local_iris = iris[:100].to_pandas(wrap=True)
|==========================================|   1 /  1  (100.00%)         0s

In [12]: local_iris[local_iris.sepalwidth < 4].head(3)
|==========================================|   1 /  1  (100.00%)         0s
Out[12]: 
   sepallength  sepalwidth  petallength  petalwidth         name
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa

wrap为True时,等同于DataFrame(iris[:100].to_pandas())

原理简述

下面,简单来说下PyODPS DataFrame的计算原理。

在某种意义上,PyODPS DataFrame可以认为是DSL(领域特定语言)。在到立即执行的操作(如execute)前,得到的都是一个AST(抽象语法树)。

在交互式环境下,为了方便,我们在repr一个对象时,里面会调用立即执行的方法。因此,我们先把这个选项关掉,来看看执行后会是什么。

In [13]: options.interactive = False

In [14]: iris[iris.sepalwidth < 4][:10]
Out[14]: 
Collection: ref_0
  odps.Table
    name: odps_test_sqltask_finance.`pyodps_iris`
    schema:
      sepallength           : double      
      sepalwidth            : double      
      petallength           : double      
      petalwidth            : double      
      name                  : string      

Collection: ref_1
  Filter[collection]
    collection: ref_0
    predicate:
      Less[sequence(boolean)]
        sepalwidth = Column[sequence(float64)] 'sepalwidth' from collection ref_0
        Scalar[int8]
          4

Slice[collection]
  collection: ref_1
  stop:
    Scalar[int8]
      10

现在我们把verbose打开,执行的中间过程会被打印出来,我们可以看到在ODPS上,目前会把这个AST给compile成ODPS SQL来执行。

In [15]: options.verbose = True

In [16]: iris[iris.sepalwidth < 4][:10].execute()

Sql compiled:
CREATE TABLE tmp_pyodps_07ec2ed0_88c5_4649_9413_0bce14f72d6f LIFECYCLE 1 AS 
SELECT * 
FROM odps_test_sqltask_finance.`pyodps_iris` t1 
WHERE t1.`sepalwidth` < 4 
LIMIT 10
logview:
http://webconsole.odps.aliyun-inc.com:8080/logview/?***
|==========================================|   1 /  1  (100.00%)        32s
Out[16]: 
   sepallength  sepalwidth  petallength  petalwidth         name
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa
3          4.6         3.1          1.5         0.2  Iris-setosa
4          5.0         3.6          1.4         0.2  Iris-setosa
5          5.4         3.9          1.7         0.4  Iris-setosa
6          4.6         3.4          1.4         0.3  Iris-setosa
7          5.0         3.4          1.5         0.2  Iris-setosa
8          4.4         2.9          1.4         0.2  Iris-setosa
9          4.9         3.1          1.5         0.1  Iris-setosa

而对于本地数据,我们在compile阶段会把AST转化成一个执行DAG(有向无环图),在执行阶段,会按照DAG的拓扑顺序来执行,得到最终结果。

In [17]: local_iris[local_iris.sepalwidth < 4][:10].compile()
Out[17]: <odps.dag.DAG at 0x10c233950>

好了,至此,已经简单说明了PyODPS DataFrame框架的执行原理。

PyODPS还很年轻,期待大家来使用、提feature、贡献代码。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
分布式计算 MaxCompute Python
在PyODPS DataFrame自定义函数中使用pandas、scipy和scikit-learn
背景 [PyODPS DataFrame]http://pyodps.readthedocs.io/zh_CN/latest/) 提供了类似 pandas 的接口,来操作 ODPS 数据,同时也支持在本地使用 pandas,和使用数据库来执行。
14465 2
|
SQL 分布式计算 MaxCompute
PyODPS学习:使用DataFrame实现SQL的IF判断
使用DataFrame实现SQL的IF判断
3461 0
|
分布式计算 关系型数据库 数据库
PyODPS DataFrame:统一的数据查询语言
前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute、persist等之前,都只是构建了表达式。
6599 0
|
分布式计算 数据挖掘 API
PyOdps DataFrame来临,数据分析从未如此简单!
PyOdps正式发布DataFrame框架(此处应掌声经久不息),DTer的福音!有了它,就像卷福有了花生,比翼双飞,哦不,如虎添翼。 快过年了,大家一定没心情看长篇大论的分析文章。作为介绍PyOdps DataFrame的开篇文章,我只说说其用起来爽的地方。其余的部分,从使用、问题到实现原理,我
11525 0
PyODPS DataFrame 处理笛卡尔积的几种方式
PyODPS 提供了 DataFrame API 来用类似 pandas 的接口进行大规模数据分析以及预处理,本文主要介绍如何使用 PyODPS 执行笛卡尔积的操作。 笛卡尔积最常出现的场景是两两之间需要比较或者运算。
13294 0
|
分布式计算 DataWorks MaxCompute
PyODPS DataFrame 的代码在哪里跑
在使用 PyODPS DataFrame 编写数据应用时,尽管编写的是同一个脚本文件,但其中的代码会在不同位置执行,这可能导致一些无法预期的问题,本文介绍当出现相关问题时,如何确定代码在何处执行,以及提供部分场景下解决问题的方法。
5784 0
|
4月前
|
DataWorks Kubernetes 大数据
飞天大数据平台产品问题之DataWorks提供的商业化服务如何解决
飞天大数据平台产品问题之DataWorks提供的商业化服务如何解决
|
4月前
|
SQL DataWorks 安全
DataWorks产品使用合集之如何实现分钟级调度
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
运维 DataWorks 监控
DataWorks产品使用合集之如何自定义UDTF
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。

相关实验场景

更多