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

Scala如何提取字符串中NT对应值并存储为Spark DataFrame

解决方案

完全可以通过正则匹配实现该需求,以下是具体实现方式:

实现思路

  1. 用正则规则NT=([^,]+)匹配目标内容,其中括号包裹的部分为我们需要的捕获组,对应NT=后到下一个逗号前的子串
  2. 直接调用Spark SQL内置的regexp_extract函数完成提取,无需额外处理字符串拆分逻辑

完整代码示例

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.regexp_extract

object NTExtractDemo {
  def main(args: Array[String]): Unit = {
    // 初始化SparkSession,集群运行时删除master配置即可
    val spark = SparkSession.builder()
      .appName("ExtractNTValue")
      .master("local[*]")
      .getOrCreate()
    
    import spark.implicits._

    // 此处替换为你自己的数据源读取逻辑,比如从文件、kafka等读取原始数据
    val rawDF = Seq(
      "fromTo: NT=xxx_bt_bsns_m,OD=ntis,OS=wnd,SX=xs,SZ=ddp,",
      "fromTo: NT=xds_bt2_bswns_m,OD=nis,OS=wnd,SX=xs,SZ=ddp,",
      "fromTo: NT=xxa_bt1_b1ns_m,OD=nts,OS=nd,SX=xs,SZ=ddp"
    ).toDF("raw_line")

    // 提取NT值并重命名列
    val resultDF = rawDF.select(
      regexp_extract($"raw_line", "NT=([^,]+)", 1).alias("Name")
    )

    // 输出验证结果,false表示不截断字符串
    resultDF.show(false)

    spark.stop()
  }
}

输出效果

运行后输出和你预期的格式完全一致:

+--------------------+
|Name                |
+--------------------+
|xxx_bt_bsns_m       |
|xds_bt2_bswns_m     |
|xxa_bt1_b1ns_m      |
+--------------------+

正则规则说明

  • NT=:匹配固定前缀,定位到目标子串的起始位置
  • [^,]+:[^,]表示匹配所有非逗号的字符,+表示匹配至少1次,保证取到下一个逗号前的所有内容
  • 括号():将匹配到的目标内容标记为捕获组,regexp_extract第三个参数设为1即取第一个捕获组的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:04