本文为您介绍PyODPS如何避免将数据下载到本地。

PyODPS提供了多种方便下载数据到本地的操作,因此,当设备允许的情况下,可以把数据下载到本地处理,然后再上传到MaxCompute上。但这种操作非常低效,数据下载到本地再进行处理无法使用到MaxCompute的大规模并行能力。当数据量大于10MB,不建议进行本地数据处理。常见的会将数据下载到本地的操作如下:
  • head、tail、to_pandas方法的调用。通常,可以调用head、tail方法返回少量数据进行数据探查,当数据量较大时,建议调用persist方法将数据直接保存在MaxCompute表中。
  • 在Table上执行open_reader获取表数据或在SQL的Instance上直接执行open_reader获取表数据。当数据量较大时,建议使用PyODPS DataFrame(从MaxCompute表创建)和MaxCompute SQL 来处理数据,以替代本地数据处理这种比较低效的方式。

示例代码

在对单行数据应用一个Python函数或者需要实现一行变多行这些场景下,可以通过PyODPS DataFram的apply(axis=1)map_reduce 接口 轻松完成,同时也可以使用到MaxCompute的并行计算能力。例如,将一份JSON串数据按Key-Value对展开成一行,示例代码如下。

本地测试,通过head()返回少量数据进行探查。
In [12]: df.head(2)
               json
0  {"a": 1, "b": 2}
1  {"c": 4, "b": 3}

In [14]: from odps.df import output

In [16]: @output(['k', 'v'], ['string', 'int'])
    ...: def h(row):
    ...:     import json
    ...:     for k, v in json.loads(row.json).items():
    ...:         yield k, v
    ...:   

In [21]: df.apply(h, axis=1).head(4)

   k  v
0  a  1
1  b  2
2  c  4
3  b  3
线上生产执行时通过persist()直接将结果存回MaxCompute表。
In [14]: from odps.df import output

In [16]: @output(['k', 'v'], ['string', 'int'])
    ...: def h(row):
    ...:     import json
    ...:     for k, v in json.loads(row.json).items():
    ...:         yield k, v
    ...:   

In [21]: df.apply(h, axis=1).persist('my_table')