PyODPS节点实现避免将数据下载到本地

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

背景信息

PyODPS提供了多种方便下载数据到本地的方法。因此,在设备允许的情况下,可以把数据下载到本地处理,然后再上传至MaxCompute。但是这种操作非常低效,数据下载到本地进行处理,无法使用MaxCompute的大规模并行能力。当数据量大于10 MB时,不建议进行本地数据处理。常见的将数据下载到本地的操作如下:

  • Head、Tail和To_pandas方法的调用。通常,可以调用head、tail方法返回少量数据进行数据探查,当数据量较大时,建议调用Persist方法,将数据直接保存在MaxCompute表中。详情请参见执行

  • 在表或SQL实例上直接执行Open_reader方法获取表数据。当数据量大时,建议使用PyODPS DataFrame(从MaxCompute表创建)和MaxCompute SQL来处理数据,以替代本地数据处理这种比较低效的方式。

示例代码

将一份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')