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

wkyowqbh  于 2023-10-23  发布在  Apache
关注(0)|答案(2)|浏览(155)

我是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?
gpnt7bae

gpnt7bae1#

使用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所有的框架功能?

如果是Spark框架,则不会。例如,Series对象有一个interpolate方法,而PySpark Column对象中没有。有很多方法和函数在pandas API中,而在PySpark API中没有。
是的,如果你运行toPandas(),因为你实际上是把它转换成一个pandas框架。

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

当然。事实上,在这种情况下,你甚至不应该使用Spark。pandas.read_csv可能会处理你的用例,除非你处理的是 * 巨大 * 的数据量。
试着用简单的、低技术含量的、易于理解的库来解决你的问题,并且 * 只 * 在你需要的时候去做更复杂的事情。很多时候,你不需要更复杂的技术。

pes8fvy9

pes8fvy92#

使用一些spark上下文或hive上下文方法(sc.textFile()hc.sql())读取数据“到内存”返回一个RDD,但RDD仍保留在分布式内存中(工作节点上的内存),而不是主节点上的内存。所有RDD方法(rdd.map()rdd.reduceByKey()等)被设计为在工作节点上并行运行,但有一些例外。例如,如果您运行rdd.collect()方法,你最终会把RDD的内容从所有的工作节点复制到主节点的内存中。这样你就失去了分布式计算的好处(但仍然可以运行RDD方法)。
与pandas类似,当您运行toPandas()时,您将 Dataframe 从分布式(工作)内存复制到本地(主)内存,并失去大部分分布式计算功能。因此,一个可能的工作流程(我经常使用)可能是使用分布式计算方法将数据预处理为合理的大小,然后转换为Pandas Dataframe 以获得丰富的功能集。希望这能有所帮助。

相关问题