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

Requirements for converting Spark dataframe to Pandas/R dataframe

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

我还需要在每个从属节点上安装 Python 和 R 才能进行转换吗?我正在努力寻找这方面的文档。

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到driver节点并转换为本地数据结构(pandas.DataFramebase::data.frame在Python和 R)。

矢量化用户定义函数

Spark 2.3.0 PySpark还提供了一组pandas_udf (SCALAR, GROUPED_MAP, GROUPED_AGG)它在

定义的数据块上并行操作
  • 分区以防 SCALAR 变体
  • GROUPED_MAPGROUPED_AGG 情况下的分组表达式。

每个块由

表示
  • 如果是 SCALARGROUPED_AGG 变体,一个或多个 pandas.core.series.Series
  • 单个 pandas.core.frame.DataFrame 如果 GROUPED_MAP 变体。

类似地,自 Spark 2.0.0,SparkR 提供了 dapply and gapply 函数,这些函数分别在由分区和分组表达式定义的 data.frames 上运行。

上述功能:

  • 不要收集到driver。除非数据仅包含单个分区(即 coalesce(1))或分组表达式很简单(即 groupBy(lit(1))),否则不存在单节点瓶颈。
  • 在相应执行器的内存中加载相应的块。因此,它受到每个执行程序上可用的单个块/内存大小的限制。