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

Spark中多行合并为单行并去除重复词汇的实现及SQL优化问询

解决Spark DataFrame合并去重词汇的问题

我来帮你搞定这个合并时去重词汇的问题,不管是用DataFrame API还是SQL都有对应的解决思路,咱们一步步来拆解:

DataFrame API 解决方案

你之前的代码是直接收集整个values字符串再拼接,这样不仅会保留重复的整个字符串,还会把重叠的词汇(比如多次出现的hello)也保留下来。正确的思路应该是先把每个values拆成单个词汇,再去重,最后合并:

import org.apache.spark.sql.functions.{split, explode, collect_set, concat_ws, col}

df.select("id", "values")
  // 把每个values字符串按空格拆成数组,再展开成单行单个词汇
  .withColumn("word", explode(split(col("values"), " ")))
  // 按id分组,收集所有去重后的词汇
  .groupBy("id")
  .agg(collect_set("word").alias("unique_words"))
  // 把去重后的词汇数组拼接成目标格式的字符串
  .withColumn("values", concat_ws(", ", col("unique_words")))
  .select("id", "values")

这里的关键是先用split+explode把长字符串拆成单个词汇,再用collect_set自动帮我们去重(collect_set会保留唯一值,和collect_list的区别就是自动去重),最后用concat_ws拼接成你要的格式。

SQL 解决方案

你之前的SQL问题出在:collect_set(values)是对整个values字符串去重,而不是对里面的单个词汇去重。要解决这个,咱们需要先把每个values拆成单个词汇,再收集去重:

SELECT 
  id, 
  concat_ws(', ', collect_set(word)) AS values
FROM data
-- 用LATERAL VIEW把split后的数组展开成单行单个词汇
LATERAL VIEW explode(split(values, ' ')) AS word
GROUP BY id

解释一下:

  1. split(values, ' ')把每个values字符串拆成词汇数组
  2. LATERAL VIEW explode(...)把数组展开成多行,每个词汇占一行
  3. collect_set(word)收集每个id下所有唯一的词汇
  4. 最后用concat_ws把去重后的词汇拼接成逗号分隔的字符串

这样运行后,就能得到你期望的无重复词汇的结果了。

内容的提问来源于stack exchange,提问作者Arjun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:56:13