Spark 2.4.8中无需UDF提取倒数第二个点后的字符
Spark 2.4.8 实现域名提取需求(无UDF)
需求说明
- 新增
domain列,规则如下:- 当
host字段中.的数量≥2时,提取倒数第二个.之后的所有字符 - 当
.的数量<2时,直接保留原host字符串
- 当
- 限制条件:必须在Spark 2.4.8版本中实现,禁止使用UDF
现有代码问题
原代码使用的正则表达式r'\b\w+\.\w+\b'无法准确定位到倒数第二个.,只能匹配字符串中靠前的连续单词+点+单词组合,导致输出结果不符合预期。
解决方案
方法1:数组拆分+内置函数组合
通过split将字符串拆分为数组,结合size判断数组长度,再用element_at和concat_ws拼接目标部分:
from pyspark.sql import functions as F data = [ ('google.com',), ('asdasdasd.google.com',), ('a.d.a.google.com',), ('www.google.com',) ] df = sc.parallelize(data).toDF(['host']) # 实现逻辑 result_df = df.withColumn( 'domain', F.when( F.size(F.split(F.col('host'), r'\.')) <= 2, F.col('host') ).otherwise( F.concat_ws( '.', F.element_at(F.split(F.col('host'), r'\.'), -2), F.element_at(F.split(F.col('host'), r'\.'), -1) ) ) ) result_df.show(truncate=False)
方法2:优化正则表达式匹配
使用带有非捕获组的正则,直接捕获倒数第二个.之后的内容,结合coalesce处理无匹配的情况:
result_df = df.withColumn( 'domain', F.coalesce( F.regexp_extract(F.col('host'), r'(?:.*\.)?([^.]+\.[^.]+)$', 1), F.col('host') ) ) result_df.show(truncate=False)
验证结果
两种方法均会输出符合预期的结果:
+--------------------+------------+ |host |domain | +--------------------+------------+ |google.com |google.com | |asdasdasd.google.com|google.com | |a.d.a.google.com |google.com | |www.google.com |google.com | +--------------------+------------+
内容的提问来源于stack exchange,提问作者BoomBoxBoy
相关产品推荐
相关产品推荐

