Spark SQL中LISTAGG()函数的等效替代方案咨询
Redshift LISTAGG() 转 Spark SQL 实现方案
Spark SQL没有直接对应Redshift LISTAGG()的函数,但可以通过组合内置函数实现完全等效的逻辑,以下是改写方案:
改写后的Spark SQL代码
SELECT dp_info_id, dp_type, CASE WHEN COALESCE(type, '-1') = 'Primary Name' THEN concat_ws('|', array_sort(collect_set(fir_name))) ELSE NULL END AS primary_first_name FROM dp_info c GROUP BY dp_info_id, type, dp_type
关键函数说明
collect_set(fir_name):实现原语句中LISTAGG(DISTINCT)的去重效果,返回去重后的字段值数组array_sort(...):对应原语句WITHIN GROUP (ORDER BY dp_info_id)的排序逻辑(因dp_info_id是分组字段,组内值一致,此处排序数组元素即可兼容原逻辑)concat_ws('|', ...):将排序后的数组用指定分隔符拼接成字符串,完成LISTAGG的核心拼接功能
注:原Redshift代码中GROUP BY的dp_info应为笔误,已修正为dp_info_id(与SELECT字段一致)
内容的提问来源于stack exchange,提问作者Jatin
相关产品推荐
相关产品推荐

