当前位置: 首页 > 知识库问答 >
问题:

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

杨起运
2023-03-14

我是Spark DataFrame API的初学者。

我使用此代码将csv选项卡加载到Spark数据框中

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()将其转换为熊猫,

  • 它是否将熊猫对象存储到本地内存
  • 熊猫的低级计算全部由Spark处理吗
  • 它是否公开了所有熊猫数据帧功能?(我想是的)
  • 我可以将其转换为andas并直接使用它,而不需要太多接触数据帧API吗

共有2个答案

戴品
2023-03-14

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

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

贺兴平
2023-03-14

对于实现将CSV文件读取到内存中的最终目标,使用Spark将CSV文件读取到熊猫是一种相当迂回的方法。

看起来您可能误解了这里使用的技术的用例。

Spark用于分布式计算(尽管它可以在本地使用)。它通常太重了,不能简单地在CSV文件中读取。

在您的示例中,sc.textFile方法只会给您一个spark RDD,它实际上是一个文本行列表。这可能不是你想要的。不会执行类型推断,因此如果要对CSV文件中的一列数字求和,则无法执行,因为就Spark而言,它们仍然是字符串。

只需使用熊猫即可。读取\u csv并将整个csv读取到内存中。Pandas将自动推断每列的类型。Spark不会这样做。

现在回答你的问题:

它是否将Pandas对象存储到本地内存:

是的。toPandas()将Spark DataFrame转换为Pandas DataFrame,这当然在内存中。

Pandas的低级计算全部由Spark处理吗

不。熊猫运行自己的计算,火花和熊猫之间没有相互作用,只是一些API兼容性。

它是否公开了所有熊猫数据帧功能?

否。例如,序列对象有一个插值方法,该方法在PySpark列对象中不可用。pandas API中有许多方法和函数不在PySpark API中。

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

绝对地事实上,在这种情况下,您甚至不应该使用Spark<代码>熊猫。read\u csv可能会处理您的用例,除非您正在处理大量数据。

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

 类似资料:
  • 问题内容: 我是Spark-DataFrame API的初学者。 我使用此代码将制表符分隔的csv加载到Spark Dataframe中 假设我从新文件中使用Spark创建了DataFrame,然后使用内置方法toPandas()将其转换为熊猫, 是否将Pandas对象存储到本地内存? 熊猫的低级计算是否全部由Spark处理? 它是否公开了所有熊猫数据框功能?(我想是的) 我可以将它转换为熊猫并完

  • 我只是第一次涉足iOS开发,我必须做的第一件事就是实现一个自定义容器视图控制器——让我们称之为SideBarViewController——它交换了几种可能的视图控制器中的哪一种它显示的子视图控制器,几乎与标准的Tab Bar Controller一模一样。(它几乎是一个标签栏控制器,但有一个可隐藏的侧菜单,而不是标签栏。) 根据Apple文档中的说明,每当我向容器中添加子ViewControll

  • 问题内容: 什么是真正做? 它的定义是 刷新实体时,此字段中保存的所有实体也会刷新 但这实际上意味着什么?有人可以给我一个简单的例子吗? 问题答案: 单独的CascadeType描述可能会有些混乱,但是有一种简单的方法可以从一般情况中找出来。 对于任何值,这意味着如果使用接口在实例上调用了操作,并且该实例具有对其他实体实例的引用,并且已经定义了关联,则该操作也将应用于该关联实体。 因此定义为: 从

  • 我正试图把我的头缠在Apache Mesos上,需要澄清几个项目。 我对Mesos的理解是,它是一个安装在集群中的每个物理/VM服务器(“节点”)上的可执行文件,然后提供一个Java API(不知何故),将每个单独的节点视为计算资源(CPU/RAM/等)的集体池。因此,对于使用Java API编码的程序,他们只看到一组资源,而不必担心如何/在哪里部署代码。 因此,首先,我在这里的理解可能是根本错误

  • 从文档中可以看出,-Xss用于设置JVM的堆栈大小。但我对这一说法感到非常困惑。 在Java中,每个线程都有自己的堆栈。-Xss指定的数字是否: > 线程的每个堆栈的大小。e、 如果将-Xss设置为256K,则每个线程将有一个256K大的堆栈。因此,10个线程将总共使用2560K。 非常感谢你。 编辑: 谢谢你的回答。看起来像是上面的(2)senario-Xss指定特定线程的最大堆栈大小。 然后我

  • 我在看一个典型的for循环: 我对int I=1后的分号很满意:它是一个声明新变量的语句。如果i也是一个语句,为什么后面没有分号? 另一个例子。我打开Jshell并放置以下内容: 换句话说,命令可以工作,与是否有分号无关。我希望没有它就无法工作。 最后一个示例(改编自关于