某天一个需求需要用上spark sql的内置function, first跟last。心想只要把数据按某个字段提前排序,再分组取出first跟last值就没问题。
结果却是测试中每次运行first跟last值却飘忽不定,每次运行结果都不一样。遂去看了下源码注解:
竟然说结果在shuffle之后会导致不确定性。这个本来就是聚合函数,肯定会触发shuffle。这可就尴尬了。。。。。
废话不多说,只能自己实现了。
udf是解决输入一行输出一行
udaf是解决输入多行输出一行
udtf是解决输入一行输出多行
那自然就是实现udaf了。
上代码:
这个实现必须是按特定字段排序,然后求分组内的第一个值的需求。