为什么Spark的agg函数需传Column加Seq<Column>而非直接传Seq<Column>
为什么Spark的agg方法要单独设置必填的第一个Column参数
这个设计核心是为了兼顾接口的安全性和易用性,具体原因有两个:
- 避免空参数导致的运行时错误:如果
agg只接收scala.collection.Seq<Column>类型的参数,开发者可能误传入空的Seq,这种错误只有在Spark任务实际运行的时候才会触发执行计划异常,排查成本很高。而把第一个聚合列单独设为必填项,就可以在编译阶段直接拦截空参数的调用,提前发现问题。 - 简化高频场景的调用:大部分时候大家用
agg都只需要1个聚合操作,比如统计数据行数、求某列的最大值,如果只有Seq参数的话,哪怕传一个列也要手动封装成Seq,比如得写成df.agg(Seq(count(lit(1)))),用现有设计直接写df.agg(count(lit(1)))就行,代码简洁很多。
实际上Spark也提供了直接传入Seq的重载方法,只不过底层会主动校验Seq是否为空,本质和你贴的这个定义的约束是完全一致的。
内容的提问来源于stack exchange,提问作者Vikas
相关产品推荐
相关产品推荐

