Scala如何从字符串类型的QueryResult结果中提取cbcnt字段值
正则提取cbcnt值的调整方案
原来的正则存在两点不足:一是无法过滤字符串类型值外层的双引号,二是没有截断日期时间字符串的时间部分,因此无法得到预期输出。
最终实现代码
import org.apache.spark.sql.functions.{regexp_extract, coalesce, split} df.withColumn("CbRes", split( coalesce( regexp_extract($"Col", """"cbcnt":(?:"([^"]+)"|(\d+))""", 1), regexp_extract($"Col", """"cbcnt":(?:"([^"]+)"|(\d+))""", 2) ), "T" )(0) )
逻辑说明
- 正则表达式做了分支兼容设计:
- 匹配带双引号的字符串类型值时,直接捕获引号内的内容到分组1,自动丢弃外层双引号
- 匹配不带双引号的数字类型值时,捕获数字内容到分组2
- coalesce函数会自动取两个分组中存在值的结果,同时兼容数字、字符串两种返回类型的cbcnt值
- 按字符
T拆分提取到的日期时间字符串,取第一个元素即可得到yyyy-MM-dd格式的纯日期结果
执行后输出完全符合预期:
col ---- 0 2021-07-30
内容的提问来源于stack exchange,提问作者VnS
相关产品推荐
相关产品推荐

