某天一個需求需要用上spark sql的內(nèi)置function, first跟last誉尖。心想只要把數(shù)據(jù)按某個字段提前排序葱轩,再分組取出first跟last值就沒問題腺阳。
結(jié)果卻是測試中每次運行first跟last值卻飄忽不定炕贵,每次運行結(jié)果都不一樣缘圈。遂去看了下源碼注解:
竟然說結(jié)果在shuffle之后會導致不確定性劣光。這個本來就是聚合函數(shù),肯定會觸發(fā)shuffle糟把。這可就尷尬了绢涡。。遣疯。雄可。。
廢話不多說缠犀,只能自己實現(xiàn)了数苫。
udf是解決輸入一行輸出一行
udaf是解決輸入多行輸出一行
udtf是解決輸入一行輸出多行
那自然就是實現(xiàn)udaf了。
上代碼:
這個實現(xiàn)必須是按特定字段排序辨液,然后求分組內(nèi)的第一個值的需求虐急。