Spark DataFrame 方法“toPandas”实际上在做什么?
What is the Spark DataFrame method `toPandas` actually doing?
我是 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,并使用内置方法将其转换为 pandas toPandas(),
- 是否将 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
可能会处理您的用例,除非您正在处理 大量 数据。
尝试使用简单、技术含量低、易于理解的库来解决您的问题,仅根据需要使用更复杂的东西。很多时候,您不需要更复杂的技术。
使用一些spark context或hive context方法(sc.textFile()
,hc.sql()
)读取数据'into memory'returns一个RDD,但是RDD仍然在分布式内存中(工作节点上的内存),而不是主节点上的内存。除了一些例外,所有 RDD 方法(rdd.map()
、rdd.reduceByKey()
等)都设计为在工作节点上并行 运行。例如,如果您 运行 一个 rdd.collect()
方法,您最终会将 rdd 的内容从所有工作节点复制到主节点内存。因此你失去了分布式计算的好处(但仍然可以 运行 rdd 方法)。
与pandas类似,当您运行 toPandas()
时,您将数据帧从分布式(工作者)内存复制到本地(主)内存并丢失大部分分布式计算能力。因此,一种可能的工作流程(我经常使用)可能是使用分布式计算方法将数据预先压缩到合理的大小,然后转换为 Pandas 数据框以获得丰富的功能集。希望对您有所帮助。
我是 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,并使用内置方法将其转换为 pandas toPandas(),
- 是否将 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
可能会处理您的用例,除非您正在处理 大量 数据。
尝试使用简单、技术含量低、易于理解的库来解决您的问题,仅根据需要使用更复杂的东西。很多时候,您不需要更复杂的技术。
使用一些spark context或hive context方法(sc.textFile()
,hc.sql()
)读取数据'into memory'returns一个RDD,但是RDD仍然在分布式内存中(工作节点上的内存),而不是主节点上的内存。除了一些例外,所有 RDD 方法(rdd.map()
、rdd.reduceByKey()
等)都设计为在工作节点上并行 运行。例如,如果您 运行 一个 rdd.collect()
方法,您最终会将 rdd 的内容从所有工作节点复制到主节点内存。因此你失去了分布式计算的好处(但仍然可以 运行 rdd 方法)。
与pandas类似,当您运行 toPandas()
时,您将数据帧从分布式(工作者)内存复制到本地(主)内存并丢失大部分分布式计算能力。因此,一种可能的工作流程(我经常使用)可能是使用分布式计算方法将数据预先压缩到合理的大小,然后转换为 Pandas 数据框以获得丰富的功能集。希望对您有所帮助。