求Hive查询语句:关联客户表与账户表并聚合账户号
嘿,这个需求很常见,用Hive的分组聚合函数就能完美解决,我给你一步步说明:
原始表数据
首先先明确你的两张表的结构和数据:
Client表
id,name,salary 1 ,John, 10000 2 ,Melissa, 5000
Account表
id,account_number,client_id 1 ,00920202, 1 2 ,00920203, 1 3 ,00920204, 1 4 ,00920205, 2 5 ,00920206, 2
实现查询语句
直接用这条Hive SQL就能得到你想要的结果:
SELECT c.id, c.name, c.salary, CONCAT('{', CONCAT_WS(', ', COLLECT_SET(a.account_number)), '}') AS accounts FROM Client c LEFT JOIN Account a ON c.id = a.client_id GROUP BY c.id, c.name, c.salary ORDER BY c.id;
语句细节解释
- 表关联:用
LEFT JOIN关联两张表,这样哪怕有客户没有对应的账户记录(你的示例里没有这种情况,但做个兜底),也能正常出现在结果里,不会被过滤掉。 - 聚合账户号:
COLLECT_SET(a.account_number)会把同一个客户下的所有账户号去重后收集成一个集合数组;如果你的业务允许同一个客户有重复账户号,把COLLECT_SET换成COLLECT_LIST就行。 - 格式调整:先用
CONCAT_WS(', ', ...)把数组里的元素用「逗号+空格」分隔成字符串,再用CONCAT给这个字符串前后加上大括号,正好匹配你要的{xxx, xxx, xxx}格式。 - 分组与排序:按Client的
id、name、salary分组(因为这三个是每个客户的唯一标识字段),最后按id排序,保证结果顺序和你给出的示例一致。
内容的提问来源于stack exchange,提问作者Nabil
相关产品推荐
相关产品推荐

