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

Nap*_*Jon 44 python pandas apache-spark pyspark

我是Spark-DataFrame API的初学者.

我使用此代码将csv tab分隔为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)
Run Code Online (Sandbox Code Playgroud)

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

  • 它是否将Pandas对象存储到本地内存?
  • Pandas低级计算是否由Spark处理?
  • 它是否暴露了所有pandas数据帧功能?(我想是的)
  • 我可以将它转换为潘达斯,只是完成它,没有那么多的触摸DataFrame API?

Phi*_*oud 56

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

您似乎可能误解了这里所使用的技术的用例.

Spark用于分布式计算(尽管它可以在本地使用).它通常太重了,不能用于简单地读取CSV文件.

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

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

现在回答你的问题:

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

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

Pandas低级计算是否由Spark处理

不,Pandas运行自己的计算,火花和熊猫之间没有相互作用,只有一些 API兼容性.

它是否暴露了所有pandas数据帧功能?

不可以.例如,Series对象具有interpolatePySpark Column对象中不可用的方法.pandas API中有许多方法和函数不在PySpark API中.

我可以将它转换为潘达斯,只是完成它,没有那么多的触摸DataFrame API?

绝对.事实上,在这种情况下,你可能根本就不应该使用Spark.pandas.read_csv除非你是一个工作很可能会处理你的使用情况庞大的数据量.

尝试使用简单,低技术,易于理解的库来解决您的问题,并且在您需要时进行更复杂的操作.很多时候,您不需要更复杂的技术.

  • 除了大火,sparklingpandas还旨在为Spark DataFrames提供类似熊猫的API:https://github.com/sparklingpandas/sparklingpandas (2认同)

The*_*iat 6

使用某些 Spark 上下文或 Hive 上下文方法(sc.textFile()hc.sql())将数据“读入内存”会返回一个 RDD,但该 RDD 保留在分布式内存(工作节点上的内存)中,而不是主节点上的内存中。所有 RDD 方法(rdd.map()rdd.reduceByKey()等)都设计为在工作节点上并行运行,但有一些例外。例如,如果您运行一个rdd.collect()方法,最终会将 rdd 的内容从所有工作节点复制到主节点内存。因此,您失去了分布式计算的优势(但仍然可以运行 rdd 方法)。

与 pandas 类似,当您运行 时toPandas(),您会将数据帧从分布式(工作)内存复制到本地(主)内存,并失去大部分分布式计算能力。因此,一种可能的工作流程(我经常使用)可能是使用分布式计算方法将数据预先整理成合理的大小,然后转换为具有丰富功能集的 Pandas 数据框架。希望有帮助。