Scala如何提取字符串中NT对应值并存储为Spark DataFrame
解决方案
完全可以通过正则匹配实现该需求,以下是具体实现方式:
实现思路
- 用正则规则
NT=([^,]+)匹配目标内容,其中括号包裹的部分为我们需要的捕获组,对应NT=后到下一个逗号前的子串 - 直接调用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
相关产品推荐
相关产品推荐

