spark中正则的使用
近期项目中,在写spark做数据清洗时,用了几次正则,因此总结下正则的几个方向的案例,主要方向为sparkSQL函数和自定义函数中的使用。
不全,待补充:
1、匹配:
//此方法含义为如果输入age符合正则规则(findAllMatchIn迭代器不为空),则返回本身
val calAge = udf((age: String, defyear: String) => {
val reg = "^(19[5-9][0-9]|20[0-1][0-9]|2020)$".r
if (reg.findAllMatchIn(age).hasNext) {
age
} else defyear
})
2、分割:
//yyyMMdd格式转换(2012-10-30T05:09:45.592Z)
val ymd = udf((str: String) => {
if (str == null || str.equals("None")) {
null
} else {
val tms = str.split("[T.]")
tms(0) + " " + tms(1)
}
})
3、替换:
//hiveSQL函数,regexp_replace()(2012-10-30T05:09:45.592Z)
df.withColumn("joinedAt2",unix_timestamp(regexp_replace(regexp_replace($"joinedAt","Z",""),"T"," "))).show()
4、提取:
//正则提取获取时间(2012-10-02 15:53:05.754000+00:00),方法1:
val invitedTime=udf((time:String)=>{
val reg = "(.*)\\..*".r
val reg(a)=time
a
})
//正则提取获取时间(2012-10-02 15:53:05.754000+00:00),方法2:
val invitedTime2=udf((time:String)=>{
val r: Regex = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})".r
val matches: Iterator[Regex.Match] = r.findAllMatchIn(time)
matches.mkString
})
//hivesql函数,regexp_extract()正则提取每个分组的内容(2012-10-30T05:09:45.592Z)
df.withColumn("joinedAt3",
concat_ws(" ",
regexp_extract($"joinedAt","(.*)T(.*).[0-9]{3}Z",1),
regexp_extract($"joinedAt","(.*)T(.*).[0-9]{3}Z",2)))
.show(false)
scala中正则的详细使用参考文章:十六、scala正则