Spark读取ES数据时load后执行select是否先加载全量数据再筛选字段?
结论
你示例的代码使用Elasticsearch官方Spark连接器时,Spark会先将需要的country字段下推到ES侧,仅加载该字段对应的数据,不会先拉取所有记录的全部字段再做筛选。
底层逻辑
- Elasticsearch官方维护的
elasticsearch-spark连接器原生支持Spark的列裁剪下推(Projection Pushdown)能力 - 你调用
load()方法时仅生成逻辑执行计划,没有实际触发数据加载,后续的select操作会被纳入执行计划的优化环节 - 连接器向ES发起查询请求时,会自动携带
"_source": ["country"]参数,ES侧仅返回指定字段的内容,大幅减少网络传输和Spark侧的数据解析开销
验证方法
你可以通过以下两种方式自行验证该逻辑:
- 对生成的DataFrame执行
indexData.explain(true),查看打印的物理执行计划,ReadSchema部分会明确标识仅读取country字段 - 开启Elasticsearch的查询审计日志,能看到Spark发起的查询请求中明确指定了返回字段仅为
country
注意事项
如果使用非官方的自定义ES数据源,不排除存在未实现下推逻辑、先拉取全量字段再在Spark内存中筛选的可能,建议优先使用官方维护的连接器版本。
内容的提问来源于stack exchange,提问作者Максим Сазонов
相关产品推荐
相关产品推荐

