如何在Apache Spark/SQL中将多行客户产品数据合并为单行记录
Apache Spark SQL 多产品行聚合实现方案
实现需求的最简代码
Spark SQL 原生支持数组聚合+字符串拼接能力,不需要复杂子查询即可实现效果:
SELECT account_customerkey, concat_ws('/', collect_set(account_producttype)) AS Product FROM ACCOUNT GROUP BY account_customerkey
函数说明
collect_set(字段):按分组维度汇总同一客户的所有产品名称,返回去重的数组集合;如果不需要去重可替换为collect_listconcat_ws('分隔符', 数组):将数组内所有元素用指定分隔符拼接为完整字符串,此处填写'/'即可完全匹配你需要的输出格式
原有代码错误原因
你的现有写法无法得到正确结果的核心问题:
- 子查询内每行仅对应一个产品,每行concat后仅包含当前行产品信息,外层max函数只能取到某一行的结果,无法汇总所有产品
- 额外的自连接操作属于冗余逻辑,还可能引入重复数据
兼容自定义命名规则的修改方案
如果你需要对不同产品做自定义命名、加前后缀,可以直接修改为以下写法,不需要子查询和关联:
SELECT account_customerkey, concat_ws('/', max(CASE WHEN account_producttype = 'Savings' THEN 'Savings' END), max(CASE WHEN account_producttype = 'Checking' THEN 'Checking' END), max(CASE WHEN account_producttype = 'CD' THEN 'CD' END), max(CASE WHEN account_producttype = 'IRA' THEN 'IRA' END), max(CASE WHEN account_producttype = 'Standard Loan' THEN 'SL' END), max(CASE WHEN account_producttype = 'Auto' THEN 'Auto' END), max(CASE WHEN account_producttype = 'Mortgage' THEN 'Mortgage' END), max(CASE WHEN account_producttype = 'Credit Card' THEN 'CreditCard' END) ) AS Description FROM ACCOUNT GROUP BY account_customerkey
以上所有语法均为Spark SQL原生支持,不需要依赖MySQL等其他数据库组件,可直接在你现有环境运行。
内容的提问来源于stack exchange,提问作者user14316330
相关产品推荐
相关产品推荐

