Spark:基于正则表达式匹配创建列而无需提取

时间:2019-03-27 12:43:58

标签: 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
...

在很多情况下,我无法全部列出。 我想根据扩展名或文件名来推断文件类型。
问题是我想忽略一组扩展名,例如tgzbak,到目前为止,这是我的主意:

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)$来分解我的正则表达式,但这只是一个例子。

1 个答案:

答案 0 :(得分:1)

rlike是您要寻找的功能。

此外,您需要使用另一个反斜杠\来转义反斜杠\\。看起来像这样:

df.withColumn("type",
   when('name rlike "^.+\\.txt$|^.+\\.txt.zip$", "text").otherwise("other"))