Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 基于正则表达式匹配创建列,无需提取_Regex_Scala_Apache Spark - Fatal编程技术网

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
哦,我不知道,谢谢您提供的信息:-)