49

我是 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 吗?
4

2 回答 2

66

使用 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对象具有在 PySpark对象interpolate中不可用的方法。ColumnPandas API 中有许多方法和函数,而 PySpark API 中没有。

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

绝对地。事实上,在这种情况下,您甚至可能根本不应该使用 Spark。pandas.read_csv除非您处理大量数据,否则可能会处理您的用

尝试使用简单、技术含量低、易于理解的库来解决您的问题,并且在您需要时使用更复杂的东西。很多时候,您不需要更复杂的技术。

于 2015-03-24T13:31:58.083 回答
3

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

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

于 2018-05-29T16:37:44.243 回答