You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_list
  • concat_ws('分隔符', 数组):将数组内所有元素用指定分隔符拼接为完整字符串,此处填写'/'即可完全匹配你需要的输出格式

原有代码错误原因

你的现有写法无法得到正确结果的核心问题:

  1. 子查询内每行仅对应一个产品,每行concat后仅包含当前行产品信息,外层max函数只能取到某一行的结果,无法汇总所有产品
  2. 额外的自连接操作属于冗余逻辑,还可能引入重复数据

兼容自定义命名规则的修改方案

如果你需要对不同产品做自定义命名、加前后缀,可以直接修改为以下写法,不需要子查询和关联:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:24:05