Scala/Spark聚合函数中lit(0)与lit(1)的具体作用是什么?
首先明确结论:你代码中出现的lit(0)和lit(1)都是数值字面量,和列位置索引没有任何关系。
核心逻辑说明
lit()是Spark SQL提供的标准工具函数,唯一作用就是把输入的普通字面量值包装为Column类型的对象,所有传入lit()的参数就是字面量本身的值,不存在解析为位置索引的逻辑。
两个用法的具体解释
- 关于
count(lit(1)).as("aggDataCount"):这是统计分组内总行数的常见实现方式,逻辑是给分组内每一行都生成一个固定值为1的常量列,count()统计非空值的总个数,每一行的1都属于非空值,最终统计结果就是该分组的总行数,和count("*")效果完全一致。这里的1只是随便选取的一个非空常量值,和列位置没有任何关联。 - 关于
otherwise(lit(0)):这里的逻辑是当when()函数内的判断条件不成立时,返回固定数值0参与后续的sum聚合,该条数据在求和时贡献的数值为0,符合常规的聚合统计逻辑,这里的0就是纯数值字面量。
误区补充
如果要按位置索引引用列,Spark中的实现方式是直接传入数字序号到col()函数,比如col(0),或者通过DataFrame的下标写法df(0),和lit()函数没有任何关系。
内容的提问来源于stack exchange,提问作者Jaime Montoya
相关产品推荐
相关产品推荐

