如何用PySpark高效提取DataFrame中Letters列的唯一字符?
解决方案
用PySpark内置函数就能高效完成,全程分布式处理,适配大数据集,无需手动遍历:
核心步骤
- 将
Letters列的逗号分隔字符串拆分为字符数组; - 把数组扁平化,每个字符单独成一行;
- 对字符去重;
- 收集为有序列表(可选排序逻辑匹配预期结果)。
基础实现(按字符自然排序)
from pyspark.sql import SparkSession from pyspark.sql.functions import split, explode, collect_list, col # 初始化SparkSession spark = SparkSession.builder.appName("ExtractUniqueChars").getOrCreate() # 创建示例DataFrame data = [(1, "a,b,c,d"), (2, "b,d,b"), (3, "c,y,u")] df = spark.createDataFrame(data, ["ID", "Letters"]) # 提取唯一字符列表 unique_chars = ( df .select(explode(split(col("Letters"), ","))) # 分割字符串并展开为单行字符 .distinct() # 去重 .orderBy(col("col")) # 按字符自然排序 .agg(collect_list(col("col"))) # 收集为列表 .first()[0] # 取出结果列表 ) print(unique_chars) # 输出: ['a', 'b', 'c', 'd', 'u', 'y']
按首次出现顺序实现(匹配预期结果)
如果需要严格按照字符首次出现的顺序输出['a','b','c','d','y','u'],可以先记录每个字符首次出现的最小ID,再按该ID排序:
from pyspark.sql.functions import min unique_chars_ordered = ( df .select(explode(split(col("Letters"), ",")).alias("char"), col("ID")) .groupBy("char") .agg(min("ID").alias("first_appear_id")) # 获取字符首次出现的ID .orderBy("first_appear_id", "char") # 按首次出现顺序排序 .agg(collect_list("char")) .first()[0] ) print(unique_chars_ordered) # 输出: ['a', 'b', 'c', 'd', 'y', 'u']
内容的提问来源于stack exchange,提问作者agusteando
相关产品推荐
相关产品推荐

