Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 在本地使用pyspark处理大型文件_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 在本地使用pyspark处理大型文件

Python 在本地使用pyspark处理大型文件,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我是PySpark的新手,只是用它来处理数据 我有一个120GB的文件,包含超过10.5亿行。我能够对文件进行聚合和过滤,并使用coalesce()函数将结果输出到CSV文件,而不会出现任何问题 我的挑战是,当我尝试读取文件中的每一行以执行某些计算时,我的spark作业使用.collect()或.toLocalitator()函数失败。当我限制我读取的行数时,它工作得很好 请问,我如何解决这个挑战?是否可以按位读取行,例如一次读取一行或一次读取一块 我在64GB RAM计算机上本地运行Spark

我是PySpark的新手,只是用它来处理数据

我有一个120GB的文件,包含超过10.5亿行。我能够对文件进行聚合和过滤,并使用coalesce()函数将结果输出到CSV文件,而不会出现任何问题

我的挑战是,当我尝试读取文件中的每一行以执行某些计算时,我的spark作业使用.collect()或.toLocalitator()函数失败。当我限制我读取的行数时,它工作得很好

请问,我如何解决这个挑战?是否可以按位读取行,例如一次读取一行或一次读取一块

我在64GB RAM计算机上本地运行Spark

下面是我的python代码示例:

sql = "select * from table limit 1000"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation
下面是我失败的python代码示例:

sql = "select * from table"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation
以下是我提交spark工作的方式

spark-submit --driver-memory 16G --executor-memory 16G python_file.py

非常感谢。

你处理这个问题的方法是错误的。
collect
方法将完整的文件加载到驱动程序内存(单个pyspark进程)中,导致内存不足。
根据经验,如果您在spark code中使用
collect()
方法,则该方法不好,应予以更改。


如果使用得当,spark将一次只读取部分输入数据(输入拆分),以进行处理,并生成(小得多)存储在执行器内存中的中间结果。因此,它(取决于处理的类型)可以处理120GB的文件和16GB的内存。

收集数据就像首先将整个数据集加载到内存中一样。如果你解释了所有的重复,甚至更糟。我不明白为什么你必须使用
collect()
进行处理。您可以对每一行应用转换。使用
collect()
可以将所有内容放入驱动程序,即将所有内容加载到内存中。这显然是错误的,在这种情况下,你完全可以不带火花地完成它。通过火花正确操作或不使用火花。但不像你在上面做的那样。。。任何
map()。你应该再读一读Spark,也许还有文档