Regex 基于正则表达式匹配创建列,无需提取
我有大量这样的文件列表:Regex 基于正则表达式匹配创建列,无需提取,regex,scala,apache-spark,Regex,Scala,Apache Spark,我有大量这样的文件列表: file.txt file.txt.tar.gz file.txt.tgz core123165 core123165.bak file.jpg file.jpg.bak file.png file.png.tgz ... 有很多案例我不能一一列举。 我想根据扩展名或文件名推断文件类型。 问题是我想忽略一组扩展,例如tgz或bak,到目前为止,我的想法如下: val DF = spark.createDF( List(("file.txt"),
file.txt
file.txt.tar.gz
file.txt.tgz
core123165
core123165.bak
file.jpg
file.jpg.bak
file.png
file.png.tgz
...
有很多案例我不能一一列举。
我想根据扩展名或文件名推断文件类型。问题是我想忽略一组扩展,例如
tgz
或bak
,到目前为止,我的想法如下:
val DF = spark.createDF(
List(("file.txt"),("file.txt.tar.gz"),("file.txt.tgz"),
("core123165"),("core123165.bak"),("file.jpg"),
("file.jpg.bak"),("file.png"),("file.png.tgz")),
List(("name", StringType, true))
)
DF.withColumn("type",
when($"name".endsWith(".txt"), "text").
when($"name".endsWith(".txt.tar.gz"), "text").
when($"name".endsWith(".txt.tgz"), "text").
when($"name".endsWith(".txt.bz2"), "text").
when[...]
)
等等,但是我需要使用正则表达式来识别核心文件,比如^core[0-9]{6}$
,并且希望使用正则表达式来更容易地识别其他类型,比如^.+\.txt$\^.+\.txt.zip$\.+\.txt.gz$
所以我的问题是,是否有一种Spark/Scala方法适用于column来执行以下操作:
val DF = spark.createDF(
List(("file.txt"),("file.txt.tar.gz"),("file.txt.tgz"),
("core123165"),("core123165.bak"),("file.jpg"),
("file.jpg.bak"),("file.png"),("file.png.tgz")),
List(("name", StringType, true))
)
DF.withColumn("type",
when($"name".matches("^.+\.txt$|^.+\.txt.zip$|^.+\.txt.gz$|^.+\.txt.bz2$^.+\.txt.tar.gz$^.+\.txt.tgz$"), "text").
when($"name".matches("^core[0-9]{6}$|^core[0-9]{6}\.bak$"), "core")
[...]
)
这将大大改善我的治疗
我知道我可以使用
^.+\.txt(\.bak\.tgz\.bz2)$
对正则表达式进行更多的分解,但这只是一个例子。rlike
是您正在寻找的函数
此外,还需要使用另一个反斜杠来转义反斜杠:\\
。这看起来像这样:
df.withColumn("type",
when('name rlike "^.+\\.txt$|^.+\\.txt.zip$", "text").otherwise("other"))
我看到您想用
$“name.rlike”“
替换$”name.rlike”“
。请注意,只要您导入spark.implicits.\u
哦,我不知道,谢谢您提供的信息:-)