我有大量这样的文件列表:
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方法来执行类似的操作:
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")
[...]
)
这将大大改善我的治疗。
PS:我知道我可以使用^.+\.txt(\.bak|\.tgz|\.bz2)$
来分解我的正则表达式,但这只是一个例子。
答案 0 :(得分:1)
rlike
是您要寻找的功能。
此外,您需要使用另一个反斜杠\
来转义反斜杠\\
。看起来像这样:
df.withColumn("type",
when('name rlike "^.+\\.txt$|^.+\\.txt.zip$", "text").otherwise("other"))