Pandas 为什么在PySpark进口熊猫?
大家好,在数据科学领域的大学里,我们了解到,如果我们想处理小数据,我们应该使用熊猫;如果我们处理大数据,我们可以使用spark,比如Python程序员PySpark 最近,我在一个Hackaton in the cloud(azure Synapse,在Spark中工作)中看到在笔记本中导入熊猫(我想代码是好的,因为它是由Microsoft人员编写的)Pandas 为什么在PySpark进口熊猫?,pandas,apache-spark,pyspark,Pandas,Apache Spark,Pyspark,大家好,在数据科学领域的大学里,我们了解到,如果我们想处理小数据,我们应该使用熊猫;如果我们处理大数据,我们可以使用spark,比如Python程序员PySpark 最近,我在一个Hackaton in the cloud(azure Synapse,在Spark中工作)中看到在笔记本中导入熊猫(我想代码是好的,因为它是由Microsoft人员编写的) 为什么要这样做?熊猫数据帧不支持并行化。另一方面,使用Pandas,您不需要集群,您有更多的库和易于扩展的示例。让我们说实话,它的性能对于每个不
为什么要这样做?熊猫数据帧不支持并行化。另一方面,使用Pandas,您不需要集群,您有更多的库和易于扩展的示例。让我们说实话,它的性能对于每个不需要扩展的任务都更好 因此,如果您开始数据工程生活学习,您将面临两件事:
- 外部化知识:现成的代码、片段和项目李>
- 内化知识:您非常熟悉并更喜欢的API、模式、保证以及如何编写此代码的直觉
我应该停在这里,因为前面只有猜测。使用PySpark和Pandas的主要区别在于语法。为了显示这种差异,我提供了一个简单的示例,用于读取拼花地板文件并对数据进行一些转换。正如您所见,PySpark和Pandas的语法完全不同,这意味着您的Pandas知识不能直接转移到PySpark
# Pandas
pandasDF = pd.read_parquet(path_to_data)
pandasDF['SumOfTwoColumns'] = pandasDF['Column1'] + pandasDF['Column2']
pandasDF.rename({'Column1': 'Col1', 'Column2': 'Col2'}, axis=1, inplace=True)
# PySpark
sparkDF = spark.read.parquet(path_to_data)
sparkDF = sparkDF.withColumn('SumOfTwoColumns', col('Column1') + col('Column2'))
sparkDF = sparkDF.withColumnRenamed('Column1', 'Col1').withColumnRenamed('Column2', 'Col2')
这些用法上的差异,以及语法上的差异,意味着当从使用纯Pandas代码转换到纯PySpark代码时,会有一个学习曲线。这也意味着您的遗留Pandas代码不能直接在带有PySpark的Spark上使用。幸运的是,有一些解决方案允许您在Spark上使用Pandas代码和知识
利用Pandas Spark强大功能的解决方案
在Spark上使用熊猫代码主要有两种选择:考拉和熊猫UDF
虽然不建议在使用pyspark时使用熊猫,但有时,我也看到有人这样做。基本上,让这项工作在熊猫身上感觉更合适的人。当然,Pandas不会扩展,如果数据集增长,您需要更多的RAM,可能需要更快的CPU(单核性能方面更快)。虽然这可能会限制某些场景,但在示例中,csv不足以使用spark。
我看不出任何其他原因。可能需要使用pandas写入单个文件
training_pd.csv
,就像Spark写入包含多个零件文件的文件夹一样。根据您提供的代码,我看不出其他原因。@Blackishop感谢您的评论。如果有人有其他想法,我们会将问题留待讨论,如果没有,我们将以您的答案结束。很有趣
# Pandas
pandasDF = pd.read_parquet(path_to_data)
pandasDF['SumOfTwoColumns'] = pandasDF['Column1'] + pandasDF['Column2']
pandasDF.rename({'Column1': 'Col1', 'Column2': 'Col2'}, axis=1, inplace=True)
# PySpark
sparkDF = spark.read.parquet(path_to_data)
sparkDF = sparkDF.withColumn('SumOfTwoColumns', col('Column1') + col('Column2'))
sparkDF = sparkDF.withColumnRenamed('Column1', 'Col1').withColumnRenamed('Column2', 'Col2')