我正在开发一个项目,我需要读取12个文件,平均文件大小为3 GB。我用RDD读取它们并使用spark.createDataFrame创建数据帧。现在我需要在数据帧上处理30个Sql查询,大多数它们需要输出前一个,比如相互依赖,所以我将所有中间状态保存在数据帧中并为该数据帧创建临时视图。
程序执行部分只需2分钟,但问题是将它们写入csv文件或显示结果或调用count()函数需要花费太多时间。我尝试重新分区的东西但是它花了很多时间
1.什么可以解决?
2.为什么花费太多时间甚至花费少量时间来处理所有处理?
答案 0 :(得分:0)
我用persist
解决了上述问题,并在pyspark中缓存。
Saprk是一种懒惰的编程语言,两种类型的Spark RDD操作是 - 转换和动作。转换是一种从现有RDD生成新RDD的函数,但是当我们想要使用实际数据集时,就会执行Action。当在结果之后触发动作时,新的RDD不会像转换那样形成。
每次我做一些操作都只是转换,所以如果我调用那个特定的数据帧,那么每次因为spark是懒惰的,它都会进行父查询,所以添加persist会多次停止调用父查询。它节省了大量的处理时间。