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

时间:2015-03-24 06:22:12

标签: 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)

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

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

2 个答案:

答案 0 :(得分:51)

使用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个对象具有interpolate方法,该方法在PySpark Column对象中不可用。 pandas API中有许多方法和函数不在PySpark API中。

我是否可以将其转换为使用它,只需完成它,而不需要那么多触及DataFrame API?

绝对。事实上,在这种情况下,你可能根本就不应该使用Spark。 pandas.read_csv可能会处理您的使用案例,除非您使用巨额数据量。

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

答案 1 :(得分:1)

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

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