apache-spark - 为什么在 Spark 中缓存我的数据集之前查询速度更快?
问题描述
我正在尝试比较 Spark 查询基于 Parquet 文件和缓存数据集的数据集的性能。
令人惊讶的是,对 Parquet 数据集的查询比对缓存数据的查询要快。我至少看到两个不应该这样做的原因:
- 缓存的数据在内存中,而 parquet 文件不在(它在我的 SSD 上)
- 我希望缓存的数据采用优化格式以用于火花查询
我在 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 内存进行此基准测试。
那么为什么使用缓存数据对我的列求和会更慢呢?难道我做错了什么?
解决方案
推荐阅读
- python - Python:从输入的日期和时间中减去 6 小时?
- sql - 在 Eclipse 链接中记录更改
- java - JavaFx 自定义控件和 Spring DI
- here-api - Here API RouteMatch - 在单个请求中处理超过 150 个航点
- vue.js - 如何动态生成表单元素并存储值(Vue 3)
- geocoding - HERE 批量地理编码器的 OpenApi 规范
- linq - 按会话 ID linq 分组以及如何将数据存储到可观察的集合中?
- c++ - GStreamer gst_buffer_make_writable 段错误和引用计数“hack”
- javascript - Salesforce LWC 项目符号点未在富文本组件中呈现
- java - bat文件在java中完成它的工作后如何关闭cmd?