本文为您介绍Mars与PyODPS DataFrame的区别、Mars的背景信息和使用场景。

背景信息

Mars是一个基于张量的统一分布式计算框架。Mars能利用并行和分布式技术,加速Python数据科学栈,包括NumpyPandasScikit-learn。同时,也能轻松与TensorFlow、PyTorch和XGBoost集成。

Mars的常用接口说明如下:
  • Mars的Mars tensor接口和Numpy保持一致,且支持大规模高维数组。示例代码如下。
    import mars.tensor as mt
    a = mt.random.rand(10000, 50)
    b = mt.random.rand(50, 5000)
    a.dot(b).execute()
  • Mars DataFrame接口和Pandas保持一致,且支持大规模数据处理和分析。示例代码如下。
    import mars.dataframe as md
    
    ratings = md.read_csv('Downloads/ml-20m/ratings.csv')
    movies = md.read_csv('Downloads/ml-20m/movies.csv')
    movie_rating = ratings.groupby('movieId', as_index=False).agg({'rating': 'mean'})
    result = movie_rating.merge(movies[['movieId', 'title']], on='movieId')
    result.sort_values(by='rating', ascending=False).execute()
  • Mars Learn保持和Scikit-learn接口一致。示例代码如下。
    import mars.dataframe as md
    from mars.learn.neighbors import NearestNeighbors
    
    df = md.read_csv('data.csv')
    nn = NearestNeighbors(n_neighbors=10)
    nn.fit(df)
    neighbors = nn.kneighbors(df).fetch()

    Mars Learn可以很方便地与TensorFlow、PyTorch和XGBoost集成。

Mars与PyODPS DataFrame的区别

  • API

    Mars DataFrame接口完全兼容Pandas。DataFrame和Mars tensor兼容Numpy,Mars Learn兼容Scikit-learn。

    PyODPS只有DataFrame接口,和Pandas的接口差异较大。

  • 索引
    PyODPS不支持索引操作,Mars DataFrame支持索引操作。示例代码如下。
    In [1]: import mars.dataframe as md
    
    In [5]: import mars.tensor as mt
    
    In [7]: df = md.DataFrame(mt.random.rand(10, 3), index=md.date_range('2020-5-1', periods=10))
    
    In [9]: df.loc['2020-5'].execute()
    Out[9]:
                       0         1         2
    2020-05-01  0.061912  0.507101  0.372242
    2020-05-02  0.833663  0.818519  0.943887
    2020-05-03  0.579214  0.573056  0.319786
    2020-05-04  0.476143  0.245831  0.434038
    2020-05-05  0.444866  0.465851  0.445263
    2020-05-06  0.654311  0.972639  0.443985
    2020-05-07  0.276574  0.096421  0.264799
    2020-05-08  0.106188  0.921479  0.202131
    2020-05-09  0.281736  0.465473  0.003585
    2020-05-10  0.400000  0.451150  0.956905
  • 数据顺序
    Mars DataFrame一旦创建,会保证数据顺序,因此一些时序操作(例如shift)以及向前向后填空值操作(例如ffill、bfill),只有Mars DataFrame支持。
    In [3]: df = md.DataFrame([[1, None], [None, 1]])
    
    In [4]: df.execute()
    Out[4]:
         0    1
    0  1.0  NaN
    1  NaN  1.0
    
    In [5]: df.ffill().execute() #空值用上一行的值。
    Out[5]:
         0    1
    0  1.0  NaN
    1  1.0  1.0

    由于PyODPS使用MaxCompute计算和存储数据,而MaxCompute并不保证数据顺序,因此PyODPS不保证数据顺序而不支持时序操作。

  • 执行层

    PyODPS仅是一个客户端,不包含任何服务端部分。PyODPS DataFrame执行时,会将计算编译至MaxCompute SQL执行。因此,PyODPS DataFrame支持的操作,取决于MaxCompute SQL。此外,每一次调用execute方法时,会提交一次MaxCompute作业,需要在集群内调度。

    Mars本身包含客户端和分布式执行层。通过调用o.create_mars_cluster,在MaxCompute内部创建Mars集群。一旦创建Mars集群,您可以直接与Mars集群进行交互。计算会直接提交至Mars集群,调度开销极小。在数据规模较小时,Mars更有优势。

使用场景

Mars与PyODPS DataFrame使用场景如下:
  • 适合Mars的使用场景
    • 经常使用PyODPS DataFrame的to_pandas()方法,将PyODPS DataFrame转成Pandas DataFrame的场景。
    • 用户熟悉Pandas接口,而不愿意学习PyODPS DataFrame接口的场景。Mars DataFrame完全兼容Pandas的接口以及行为。
    • 需要使用索引的场景。Mars支持使用索引。Mars DataFrame包含行和列索引。
    • DataFrame创建后需要保证数据顺序的场景。

      Mars支持创建DataFrame后保证数据顺序。Mars DataFrame通过iloc等方法可以获取某个偏移的数据。例如,df.iloc[10]可以获取第10行数据。此外,Mars DataFrame也支持df.shift()df.ffill()等需要保证数据顺序才可以使用的特性接口。

    • 需要并行和分布化Numpy、Scikit-learn以及支持分布式运行TensorFlow、PyTorch 和 XGBoost的场景。
    • 中小型任务(数据量在TB级别以下)的场景。Mars在此场景下有较好的性能。
  • 适合PyODPS DataFrame的使用场景
    • 需要使用MaxCompute调度任务的场景。PyODPS DataFrame会将DataFrame任务编译成MaxCompute SQL执行,如果希望依托MaxCompute调度任务,建议您使用PyODPS DataFrame。
    • 稳定性要求较高的任务场景。PyODPS DataFrame会将任务编译至MaxCompute执行,由于MaxCompute相当稳定,而Mars相对比较新,如果对稳定性有很高要求,建议您PyODPS DataFrame。
    • 数据量特别大(TB级别以上)的任务场景,建议使用PyODPS DataFrame。

参考文档

技术支持

如果使用Mars过程中遇到问题,请加入技术支持钉钉群(11701793)进行咨询。