python - Spark DataFrame 方法 `toPandas` 实际上在做什么?

标签 python pandas apache-spark pyspark

我是 Spark-DataFrame API 的初学者。

我使用此代码将制表符分隔的 csv 加载到 Spark Dataframe 中

lines = sc.textFile('tail5.csv')
parts = lines.map(lambda l : l.strip().split('\t'))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)

假设我使用 Spark 从新文件创建 DataFrame,并使用内置方法 toPandas() 将其转换为 pandas,

  • 它会将 Pandas 对象存储到本地内存吗?
  • Pandas 低级计算是否全部由 Spark 处理?
  • 它是否公开了所有 pandas 数据框功能?(我猜是的)
  • 我可以将它转换为 Pandas 并完成它,而无需太多接触 DataFrame API 吗?

最佳答案

使用 spark 将 CSV 文件读入 pandas 是实现将 CSV 文件读入内存的最终目标的一种相当迂回的方法。

您似乎误解了此处所使用技术的用例。

Spark 用于分布式计算(尽管它可以在本地使用)。它通常过于繁重,无法用于简单地读取 CSV 文件。

在您的示例中,sc.textFile 方法只会为您提供一个 spark RDD,它实际上是一个文本行列表。这可能不是你想要的。不会执行类型推断,因此如果您想对 CSV 文件中的一列数字求和,您将无法这样做,因为就 Spark 而言,它们仍然是字符串。

只需使用 pandas.read_csv 并将整个 CSV 读入内存。 Pandas 会自动推断每列的类型。 Spark 不这样做。

现在回答你的问题:

是否将 Pandas 对象存储到本地内存中:

是的。 toPandas() 会将 Spark DataFrame 转换为 Pandas DataFrame,当然它在内存中。

Pandas 低级计算是否全部由 Spark 处理

没有。 Pandas 运行自己的计算,spark 和 pandas 之间没有相互作用,只是一些 API 兼容性。

它是否公开了所有 pandas 数据框功能?

没有。例如,Series 对象有一个 interpolate 方法,该方法在 PySpark Column 对象中不可用。 pandas API 中的许多方法和函数不在 PySpark API 中。

我可以将它转换为 Pandas 并完成它,而无需太多接触 DataFrame API 吗?

当然。事实上,在这种情况下,您甚至可能根本不应该使用 Spark。 pandas.read_csv 可能会处理您的用例,除非您处理的是大量数据。

尝试使用简单、技术含量低、易于理解的库来解决您的问题,并且在您需要时使用更复杂的东西。很多时候,您不需要更复杂的技术。

关于python - Spark DataFrame 方法 `toPandas` 实际上在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29226210/

相关文章:

java - Spark 是否在其集群中维护哈希函数?

c - 如何在 Linux 中序列化对目录的访问?

python - 非重复计数算法

python - 根据日期合并 Pandas Dataframes

python - Flask:peewee.OperationalError:没有这样的表:

python - 更改数据框的数据类型以使用该数据进行数据可视化的明确目的

hadoop - Spark Streaming + Hbase:NoClassDefFoundError:org/apache/hadoop/hbase/spark/HBaseContext

python - for if 循环根据条件进行分类

python - pandas 中添加列的一些计算

python - 从具有 'different date format"的数据框中的日期列中提取年份 - python