我想比较读取pyspark和scala spark文件的时间。在Scala中,我正在执行以下操作:
import org.apache.spark.sql.SparkSession
object Playground extends App {
def getDfFromFile(path: String, spark: SparkSession) = {
spark
.read
.format("csv")
.option("inferSchema", true)
.option("header", true)
.load(path)
}
val master = "local"
val spark = SparkSession.builder()
.master(master)
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
val N = 1
val avgTime = (0 until N)
.map(_ => {
val start = System.nanoTime()
getDfFromFile("resources/bigdatafile.csv", spark)
val end = System.nanoTime()
end - start
}).sum / Math.pow(10, 9)
println(avgTime)
}
使用N = 1
大约需要2.7秒。如果将其增加到10,则大约需要3.7秒。使用N = 100
,需要9.7秒。
很明显,时间的增加量在N中不是线性的。为什么不呢?怎样使它线性化,以便可以有效地比较在Spark和PySpark中第一次读取文件 所需的时间?
编辑:
如果我更改代码以改为在map函数内创建sparkSession:
val N = 100
val avgTime = (0 until N)
.map(_ => {
val spark = SparkSession.builder()
.master(master)
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
val start = System.nanoTime()
getDfFromFile("resources/bigdatafile.csv", spark)
val end = System.nanoTime()
spark.close()
end - start
}).sum / Math.pow(10, 9)
对结果几乎没有影响。
答案 0 :(得分:1)
火花执行策略是惰性的,在您的情况下,这意味着火花仅在您对其执行操作操作(收集,接收,...)时才从文件中加载数据,但是您的代码仅计算开始时间和结束时间并进行汇总,因此无需从文件中加载数据!
对于时间评估,您应该对文件数据应用一些逻辑(包括动作操作),例如,可以应用字数统计算法,甚至可以只打印任何行。