PySpark字符串列去重:保留唯一字母(不使用UDF)
在PySpark中保留字符串列的唯一字母字符(原生无UDF方案)
要实现仅保留字符串列中的唯一字母字符,且不使用UDF,可以通过PySpark内置函数的组合来完成,核心思路是先过滤非字母字符,再拆分去重后拼接。
具体实现代码
from pyspark.sql import SparkSession from pyspark.sql.functions import regexp_replace, split, array_distinct, concat_ws # 初始化Spark会话 spark = SparkSession.builder.appName("UniqueLettersExtraction").getOrCreate() # 创建测试数据 df = spark.createDataFrame([("abcbb12b",)], ["input_str"]) df.show() # 执行处理逻辑 result_df = df.withColumn( "cleaned_letters", regexp_replace("input_str", "[^a-zA-Z]", "") # 移除所有非字母字符 ).withColumn( "char_array", split("cleaned_letters", "") # 将字符串拆分为单个字符的数组 ).withColumn( "unique_char_array", array_distinct("char_array") # 对字符数组去重 ).withColumn( "output_str", concat_ws("", "unique_char_array") # 将去重后的数组拼接为字符串 ).select("input_str", "output_str") result_df.show()
步骤解释
- 过滤非字母字符:使用
regexp_replace配合正则[^a-zA-Z],把输入字符串里的数字、符号等非字母内容全部替换为空,得到纯字母字符串(示例中得到abcbbb)。 - 拆分字符为数组:用
split将纯字母字符串按空字符串拆分,生成单个字符组成的数组(示例中得到["a","b","c","b","b","b"])。 - 数组去重:通过
array_distinct对字符数组去重,保留每个字母的首次出现(示例中得到["a","b","c"])。 - 拼接回字符串:用
concat_ws以空字符串为分隔符,把去重后的数组重新拼接成最终结果字符串(示例中得到abc)。
关于你之前的问题
你提到尝试re.sub未成功,原因是在PySpark原生API中不能直接调用Python的re模块(除非用UDF,但你要求排除这种方式),必须使用PySpark内置的regexp_replace函数来做正则替换操作。
内容的提问来源于stack exchange,提问作者ind_1617
相关产品推荐
相关产品推荐

