我是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?
2条答案
按热度按时间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
方法,而PySparkColumn
对象中没有。有很多方法和函数在pandas API中,而在PySpark API中没有。是的,如果你运行
toPandas()
,因为你实际上是把它转换成一个pandas框架。我可以将其转换为Pandas并直接完成它,而不需要太多接触DataFrame API吗?
当然。事实上,在这种情况下,你甚至不应该使用Spark。
pandas.read_csv
可能会处理你的用例,除非你处理的是 * 巨大 * 的数据量。试着用简单的、低技术含量的、易于理解的库来解决你的问题,并且 * 只 * 在你需要的时候去做更复杂的事情。很多时候,你不需要更复杂的技术。
pes8fvy92#
使用一些spark上下文或hive上下文方法(
sc.textFile()
,hc.sql()
)读取数据“到内存”返回一个RDD,但RDD仍保留在分布式内存中(工作节点上的内存),而不是主节点上的内存。所有RDD方法(rdd.map()
,rdd.reduceByKey()
等)被设计为在工作节点上并行运行,但有一些例外。例如,如果您运行rdd.collect()
方法,你最终会把RDD的内容从所有的工作节点复制到主节点的内存中。这样你就失去了分布式计算的好处(但仍然可以运行RDD方法)。与pandas类似,当您运行
toPandas()
时,您将 Dataframe 从分布式(工作)内存复制到本地(主)内存,并失去大部分分布式计算功能。因此,一个可能的工作流程(我经常使用)可能是使用分布式计算方法将数据预处理为合理的大小,然后转换为Pandas Dataframe 以获得丰富的功能集。希望这能有所帮助。