如何围绕指定列对Snowpark DataFrame进行自定义透视转换?
解决方案:Snowpark按列分组聚合整行数据
你需要的不是pivot功能,而是按指定列分组,将每组的所有行聚合成数组,用Snowpark的groupBy+collect_list就能高效实现,比你说的逐个过滤原表的方法更优。
原DataFrame
| a | b | c |
|---|---|---|
| 1 | X | { "prop": 9 } |
| 2 | Y | { "prop": 10 } |
| 3 | Z | { "prop": 10 } |
| 4 | Z | { "prop": 11 } |
| 5 | X | { "prop": 9 } |
实现代码
情况1:c是Snowpark结构体类型
from snowflake.snowpark.functions import col, collect_list, struct # 假设原DataFrame名为df result_df = df.groupBy(col("c.prop")) \ .agg(collect_list(struct(*df.columns)).alias("rows"))
情况2:c是JSON字符串类型
如果c是存储为字符串的JSON,需要先解析提取prop:
from snowflake.snowpark.functions import col, collect_list, struct, parse_json result_df = df.groupBy(parse_json(col("c")).get_item("prop").alias("c.prop")) \ .agg(collect_list(struct(*df.columns)).alias("rows"))
输出结果
| c.prop | rows |
|---|---|
| 9 | [{"a":1,"b":"X","c":{"prop":9}}, {"a":5,"b":"X","c":{"prop":9}}] |
| 10 | [{"a":2,"b":"Y","c":{"prop":10}}, {"a":3,"b":"Z","c":{"prop":10}}] |
| 11 | [{"a":4,"b":"Z","c":{"prop":11}}] |
说明
struct(*df.columns)将每行的所有字段打包成一个结构体,确保聚合后能保留整行的完整数据collect_list函数将分组内的所有结构体收集为一个数组- 这个方法只需要扫描原表一次,相比逐个过滤的方案,在数据量较大时性能提升明显
内容的提问来源于stack exchange,提问作者samdouble
相关产品推荐
相关产品推荐

