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

功能

Mars是一个基于张量的统一分布式计算框架。Mars能利用并行和分布式技术,为Python数据科学栈加速,包括NumpyPandasScikit-learn

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保持一致。示例代码如下。Mars Learn可以集成TensorFlow、PyTorch和XGBoost

    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()

与PyODPS DataFrame的区别

  • API
    • Mars

      Mars DataFrame完全兼容Pandas。Mars Tensor兼容Numpy。Mars Learn兼容Scikit-learn。

    • PyODPS

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

  • 索引
    • Mars
      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
    • PyODPS

      不支持索引操作。

  • 数据顺序
    • Mars
      Mars DataFrame创建后,会保证数据顺序,支持时序操作(shift)、向前(ffill)、向后(bfill)和填空值操作。
      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

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

  • 执行层
    • Mars

      Mars包含客户端和分布式执行层。您可以通过调用o.create_mars_cluster,在MaxCompute内部创建Mars集群,并将计算作业直接提交至Mars集群,调度费用极小。在数据规模较小时,Mars更有优势。

    • PyODPS

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

使用场景

Mars与PyODPS DataFrame使用场景如下:
  • Mars
    • 经常使用PyODPS DataFrame的to_pandas()方法,将PyODPS DataFrame转成Pandas DataFrame的场景。
    • 熟悉Pandas接口,但不愿意学习PyODPS DataFrame接口的场景。
    • 使用索引的场景。
    • 创建DataFrame后需要保证数据顺序的场景。

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

    • 需要并行和分布化Numpy或Scikit-learn,以及支持分布式运行TensorFlow、PyTorch和XGBoost的场景。
    • 数据量在TB级别以下的场景。
  • PyODPS DataFrame
    • 使用MaxCompute调度作业的场景。PyODPS DataFrame会将DataFrame编译成MaxCompute SQL。如果需要通过MaxCompute调度作业,建议您使用PyODPS DataFrame。
    • 稳定性要求较高的作业场景。PyODPS DataFrame会将作业编译至MaxCompute执行,由于MaxCompute相当稳定,而Mars相对比较新,如果对稳定性有很高要求,建议您使用PyODPS DataFrame。
    • 数据量在TB级别以上的场景,建议您使用PyODPS DataFrame。

参考文档

技术支持

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