Snowflake Snowpark Python:分组拼接字段问题求助
问题描述
在Snowflake中有如下数据表:
| id_request | alert_code |
|---|---|
| 100 | R70 |
| 100 | R69 |
| 100 | R54 |
| 101 | R24 |
| 101 | R93 |
需要将其转换为以下格式:
| id_request | alert_all |
|---|---|
| 100 | R70,R69,R54 |
| 101 | R24,R93 |
尝试了以下PySpark代码但运行出错:
df_alerts_3 = df_alerts_2.groupBy('id_request')\ .agg(concat_ws(lit(','), array_agg('alert_code')).alias('alert_all'))
解决方案
PySpark代码修正
你的代码错误在于concat_ws的参数使用不当:concat_ws的第一个参数直接传入字符串分隔符即可,无需用lit()包裹;同时array_agg生成的数组可直接作为concat_ws的第二个参数。修正后的代码如下:
from pyspark.sql import functions as F df_alerts_3 = df_alerts_2.groupBy('id_request')\ .agg(F.concat_ws(',', F.array_agg('alert_code')).alias('alert_all'))
Snowflake原生SQL实现
如果直接使用Snowflake SQL完成该需求,推荐使用LISTAGG函数,这是Snowflake专门用于字符串聚合的函数,用法更简洁:
SELECT id_request, LISTAGG(alert_code, ',') WITHIN GROUP (ORDER BY alert_code) AS alert_all FROM your_table_name -- 替换为你的实际表名 GROUP BY id_request;
注:WITHIN GROUP (ORDER BY alert_code)用于指定聚合后的字符串排序规则,若不需要排序可省略该部分。
内容的提问来源于stack exchange,提问作者SnowUnicorn
相关产品推荐
相关产品推荐

