Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Spark数据帧方法“toPandas”实际上在做什么?_Python_Pandas_Apache Spark_Pyspark - Fatal编程技术网

Python Spark数据帧方法“toPandas”实际上在做什么?

Python Spark数据帧方法“toPandas”实际上在做什么?,python,pandas,apache-spark,pyspark,Python,Pandas,Apache Spark,Pyspark,我是Spark DataFrame API的初学者 我使用此代码加载分隔为Spark数据帧的csv选项卡 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])

我是Spark DataFrame API的初学者

我使用此代码加载分隔为Spark数据帧的csv选项卡

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对象存储到本地内存
  • 熊猫的低级计算全部由Spark处理吗
  • 它是否公开了所有数据帧功能?(我想是的)
  • 我可以把它转换成andas并直接使用它,而不需要太多的数据帧API吗
使用spark将CSV文件读入pandas是实现将CSV文件读入内存的最终目标的一种非常迂回的方法

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

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

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

只需使用pandas.read_csv并将整个csv读入内存。熊猫将自动推断每列的类型。Spark不会这么做的

现在回答您的问题:

它是否将熊猫对象存储到本地内存中

toPandas()
会将Spark数据帧转换为Pandas数据帧,当然这是内存中的数据帧

熊猫的低级计算是否全部由Spark处理

不,Pandas运行自己的计算,spark和Pandas之间没有相互作用,只是一些API兼容性

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

否。例如,
系列
对象具有一种在PySpark
对象中不可用的
插值
方法。pandas API中有许多方法和函数不在PySpark API中

我可以将其转换为Andas并直接使用它,而不需要太多的数据帧API吗?

当然。事实上,在这种情况下,你甚至不应该使用Spark
pandas.read_csv
可能会处理您的用例,除非您正在处理大量数据


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

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


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

谢谢您回答我的问题。事实上,也许我还不够清楚。我是spark的初学者。我只是在这里测试从csv加载。我需要读取太大而无法在内存中处理的数据并进行数据分析。因此,这里的目标是在Hadoop中进行一些数据分析。所以,当我从Hadoop(hive)加载数据时,转换成pandas会将其加载到本地内存中?而且我不会在单机上使用Hadoop。我可能必须从hdfs用配置单元加载数据。如果我把它转换成熊猫,我能在分布式系统中做熊猫吗?啊。我懂了。Spark数据帧和Pandas数据帧不共享计算基础设施。Spark数据帧在有意义的地方模拟熊猫数据帧的API。如果你想在Hadoop生态系统上寻找一种类似熊猫的操作方式,另外还可以使用熊猫数据帧进入内存,那么请查看。除了blaze,sparklingpandas还旨在为pandas提供Spark数据帧上类似的API:我可以先读取带有pandas数据帧的csv,然后将其转换为Spark数据帧吗?