Spark SQL如何对逗号分隔字符串去重及类型不匹配报错解决
报错根因
调用SPLIT函数拆分字符串后,每行返回的是array<string>类型的结果,直接对该结果执行collect_set会生成嵌套数组(array<array<string>>类型),而concat_ws仅支持传入一维数组或者字符串类型作为参数,因此触发类型不匹配报错。
解决方案
根据使用场景选择对应写法:
场景1:仅对每行内部的PointNameArray字段单独去重(无需跨行聚合)
Spark 2.4及以上版本可直接用数组函数单行处理,性能更高:
SELECT ItemId, Date, concat_ws(', ', array_distinct(transform(split(PointNameArray, ','), x -> trim(x)))) AS VarN FROM dataset
代码中新增trim处理是为了避免拆分后元素前后带空格,导致apple和 apple被识别为不同值的问题。
场景2:按ItemId、Date分组,将同组所有行的PointNameArray元素合并后整体去重
先通过explode将拆分后的数组炸开展平为单个元素,再分组聚合去重:
SELECT ItemId, Date, concat_ws(', ', collect_set(item)) AS VarN FROM ( SELECT ItemId, Date, trim(explode(split(PointNameArray, ','))) AS item FROM dataset ) t GROUP BY ItemId, Date
内容的提问来源于stack exchange,提问作者user34018
相关产品推荐
相关产品推荐

