Spark SQL:按ID生成Grade数组且保留原行的查询报错解决
解决Spark SQL保留原始行并生成ID对应Grade数组的问题
问题分析
你的查询出现AnalysisException错误,原因有两点:
- 窗口函数语法错误:
OVER (PARTITION BY ID)必须直接紧跟在聚合函数(collect_list)之后,不能放在别名定义之后 - 未显式选择
ID列:Spark SQL要求查询中未被聚合的列需明确指定,否则会判定分组表达式为空
正确查询语句
如果需要输出数组格式的Grade集合(与你期望的输出格式一致),使用以下语句:
SELECT ID, collect_list(Grade) OVER (PARTITION BY ID) AS Grade FROM your_table;
如果需要输出逗号分隔的字符串格式(对应你原查询中的array_join用法),使用以下语句:
SELECT ID, array_join(collect_list(Grade), ", ") AS Grade FROM your_table;
验证结果
执行上述语句后,会得到你期望的输出:
ID,Grade 1,[A, A] 1,[A, A] 2,[B, C] 2,[B, C]
内容的提问来源于stack exchange,提问作者Uni 13
相关产品推荐
相关产品推荐

