如何在Hive SQL中提取结构体数组指定字段生成新数组
实现方案
你原有写法会将数组的每个元素拆分为独立行,因此只能返回单个color值,需要将同属原行的color值重新聚合为数组,或者直接使用数组处理函数避免拆分即可实现需求。
方案1:高版本SQL引擎直接使用数组转换函数(推荐,性能更优)
如果你的SQL引擎支持transform函数(Hive 2.3+、Spark SQL、Presto等均支持),可以直接对结构体数组做元素属性提取,无需拆分行:
SELECT transform(myColumn, item -> item.color) AS result FROM myTable;
该方法会直接遍历数组内的每个结构体,提取color字段,返回结果就是和原数组长度一致的字符串数组,完全匹配你的预期输出。
方案2:低版本引擎使用炸开+聚合
如果不支持transform函数,就在你原有写法的基础上,按原行的粒度分组后用collect_list聚合:
SELECT collect_list(arr.color) AS result FROM myTable AS mt LATERAL VIEW OUTER EXPLODE(mt.myColumn) AS arr GROUP BY mt.* -- 按原表所有字段分组,保证聚合后粒度和原表行完全一致
注意:如果需要保留原数组中color的顺序,必须使用
collect_list,不要用collect_set(后者会自动去重且不保证顺序)。
内容的提问来源于stack exchange,提问作者Amal Rajan
相关产品推荐
相关产品推荐

