我有一个连接 4 个表的查询,我使用查询下推将其读入数据帧。
val df = spark.read.format("jdbc").
option("url", "jdbc:mysql://ip/dbname").
option("driver", "com.mysql.jdbc.Driver").
option("user", "username").
option("password", "password")
.option("dbtable",s"($query) as temptable")
.load()
单个表中的记录数分别为 430、350、64、2354,加载需要 12.784 秒,创建 SparkSession 需要 2.119 秒
然后我把结果数据计算为,
val count=df.count()
println(s"count $count")
然后总执行时间为 25.806 秒,结果仅包含 430 条记录。
当我在sql工作台中尝试相同的操作时,只需几秒钟即可完全执行。我也尝试在 load() 后缓存,但它需要相同的时间。那么我怎样才能比我更快地执行它。
您正在使用一种旨在处理大数据来解决玩具示例的工具,因此您将获得所有开销,而没有任何好处
尝试以下选项
分区列
分区数
下限
上界
这些选项有助于提高 Query 的性能,因为它们将创建多个分区,并且读取将并行进行