首页 > 解决方案 > 为什么在 Spark 中缓存我的数据集之前查询速度更快?

问题描述

我正在尝试比较 Spark 查询基于 Parquet 文件和缓存数据集的数据集的性能。

令人惊讶的是,对 Parquet 数据集的查询比对缓存数据的查询要快。我至少看到两个不应该这样做的原因:

我在 300MB parquet(9M 行)上完成了这个小基准测试,只计算查询时间,而不是缓存数据的时间:

def benchmarkSum(ds: org.apache.spark.sql.DataFrame): Double = {
  var begin = System.nanoTime();
  for (int <- 1 to 1000) {
     ds.groupBy().sum("columnName").first()
  }
  return (System.nanoTime() - begin) / 1000000000.0;
}    

val pqt = spark.read.parquet("myfile.parquet");
benchmarkSum(pqt) // 54s

var cached = pqt.cache()
cached.groupBy().sum("columnName").first() // One first call to triggers the caching before benchmark.
benchmarkSum(cached) // 77s

Parquet 上的查询耗时 54 秒,而缓存数据集上的查询耗时 77 秒。
我正在spark-shell使用 8 核和 10GB 内存进行此基准测试。

那么为什么使用缓存数据对我的列求和会更慢呢?难道我做错了什么?

标签: apache-sparkcachingparquet

解决方案


推荐阅读