Scala中如何基于dense_rank列生成数据集另一列的数组
要实现将同一member_id和plan_id下的err_cd合并为逗号分隔字符串或数组的需求,无需依赖之前的窗口函数逻辑,直接通过分组聚合即可高效完成,以下是具体实现方案:
方案1:生成逗号分隔的字符串列
直接使用groupBy按member_id和plan_id分组,配合concat_ws和collect_list聚合函数合并err_cd:
val resultDF = enrollmentData .groupBy($"member_id", $"plan_id") .agg(concat_ws(",", collect_list($"err_cd")).alias("error_codes"))
方案2:生成数组类型列
如果需要保留数组格式而非字符串,直接使用collect_list即可:
val resultDFWithArray = enrollmentData .groupBy($"member_id", $"plan_id") .agg(collect_list($"err_cd").alias("error_codes"))
注意事项:保持顺序
如果需要合并后的err_cd按特定顺序排列(比如原数据中的err_cd升序),可以用collect_ordered替代collect_list,它会保证聚合后的元素顺序:
val sortedResultDF = enrollmentData .groupBy($"member_id", $"plan_id") .agg(concat_ws(",", collect_ordered($"err_cd")).alias("error_codes"))
说明:你之前定义的窗口函数windowSpec1和windowSpec2以及生成的rk、error_index列对于当前需求是冗余的,直接分组聚合就可以得到期望的输出结果,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Neha Somani
相关产品推荐
相关产品推荐

