将Spark数据帧转换为Pandas / R数据帧的要求

问题描述 投票:3回答:1

我在Hadoop的YARN上运行Spark。这种转换如何运作?在转换之前是否会发生collect()?

另外我需要在每个从节点上安装Python和R才能使转换工作?我很难找到这方面的文件。

pandas apache-spark dataframe hadoop apache-spark-sql
1个回答
11
投票

toPandas(PySpark)/ as.data.frame(SparkR)

必须在创建本地数据框之前收集数据。例如,toPandas方法如下所示:

def toPandas(self):
    import pandas as pd
    return pd.DataFrame.from_records(self.collect(), columns=self.columns)

您需要在每个节点上安装最佳的所有依赖项的Python。

SparkR对应物(as.data.frame)只是collect的别名。

总结一下,在两种情况下,数据都是collected到驱动程序节点并转换为本地数据结构(分别在Python和R中为pandas.DataFramebase::data.frame)。

矢量化用户定义的函数

由于Spark 2.3.0 PySpark还提供了一组pandas_udfSCALARGROUPED_MAPGROUPED_AGG),它们在由数据块定义的数据块上并行运行。

  • SCALAR变体的情况下的分区
  • GROUPED_MAPGROUPED_AGG的情况下分组表达式。

每个块由表示

  • pandas.core.series.SeriesSCALAR变体的情况下,一个或多个GROUPED_AGG
  • pandas.core.frame.DataFrame变体的情况下单个GROUPED_MAP

类似地,从Spark 2.0.0开始,SparkR提供了dapplygapply函数,这些函数分别在分区和分组表达式定义的data.frames上运行。

上述功能:

  • 不要收集给司机。除非数据仅包含单个分区(即使用coalesce(1))或分组表达式是微不足道的(即groupBy(lit(1))),否则没有单个节点瓶颈。
  • 将相应的块加载到相应执行程序的内存中。因此,它受每个执行器上可用的单个块/内存大小的限制。
© www.soinside.com 2019 - 2024. All rights reserved.