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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:42:30