Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Scala 以特定正则表达式开头的只读行_Scala_Apache Spark - Fatal编程技术网

Scala 以特定正则表达式开头的只读行

Scala 以特定正则表达式开头的只读行,scala,apache-spark,Scala,Apache Spark,我想要以特定正则表达式开头的只读行 val rawData = spark.read.textFile(file.path).filter(f => f.nonEmpty && f.length > 1 && f.startsWith("(")) 直到现在我都是这么做的 现在我发现我的条目以: (W) );27536-或(W)28325-(分隔符后5位) 我只想读以(W)开头的行;1234-(分隔符后4位数字) 捕获此信息的正则表达式类似于:\(

我想要以特定正则表达式开头的只读行

 val rawData = spark.read.textFile(file.path).filter(f => f.nonEmpty && f.length > 1 && f.startsWith("(")) 
直到现在我都是这么做的

现在我发现我的条目以: (W) );27536-或(W)28325-(分隔符后5位)
我只想读以(W)开头的行;1234-(分隔符后4位数字)

捕获此信息的正则表达式类似于:
\(\D\)(;\s)\D{4}
用于布尔返回,或
\(\D\)(;\124s)\D{4}-.
用于字符串匹配返回

我现在的问题是,我不知道如何在read.textFile命令中包含正则表达式。
f、 startswith仅适用于字符串
f、 匹配也仅适用于字符串

我也尝试过使用,但这会返回一个字符串而不是布尔值,我不能在filter函数中使用它


任何帮助都将不胜感激。

我找到了问题的答案

命令需要如下所示

 val lineregex = """\(\D\)(;|\s)\d{4}-.*""".r

 val rawData = spark.read.textFile(file.path)
  .filter(f => f.nonEmpty && f.length > 1 && lineregex.unapplySeq(f).isDefined )

我找到了我问题的答案

命令需要如下所示

 val lineregex = """\(\D\)(;|\s)\d{4}-.*""".r

 val rawData = spark.read.textFile(file.path)
  .filter(f => f.nonEmpty && f.length > 1 && lineregex.unapplySeq(f).isDefined )

您可以尝试使用
findFirstMatchIn
方法查找正则表达式的匹配项,该方法返回一个
选项[match]

spark.read.textFile(file.path).filter { line =>
  line.nonEmpty &&
  line.length > 1 &&
  "regex".r.findFirstMatchIn(line).isDefined
}

您可以尝试使用
findFirstMatchIn
方法查找正则表达式的匹配项,该方法返回一个
选项[match]

spark.read.textFile(file.path).filter { line =>
  line.nonEmpty &&
  line.length > 1 &&
  "regex".r.findFirstMatchIn(line).isDefined
}

其他的答案是过度思考这个问题。只需使用
匹配项

val lineRegex = """\(\D\)(;|\s)\d{4}-.*"""
val ns = List ("(W);1234-something",
               "(W);12345-something",
               "(W);2345-something",
               "(W);23456-something",
               "(W);3456-something",
               "",
               "1" )
ns.filter(f=> f.matches(lineRegex))
导致

List("(W);1234-something", "(W);2345-something", "(W);3456-something")

其他的答案是过度思考这个问题。只需使用
匹配项

val lineRegex = """\(\D\)(;|\s)\d{4}-.*"""
val ns = List ("(W);1234-something",
               "(W);12345-something",
               "(W);2345-something",
               "(W);23456-something",
               "(W);3456-something",
               "",
               "1" )
ns.filter(f=> f.matches(lineRegex))
导致

List("(W);1234-something", "(W);2345-something", "(W);3456-something")

f.startswith仅适用于字符串;f、 匹配也只适用于字符串
为什么这是一个问题?在您的筛选器中,
f
是一个字符串。因为筛选器函数需要一个bollean返回值,并且两者都返回一个字符串
matrches
不返回字符串,而是一个布尔值。
f.startswith仅适用于字符串;f、 匹配也只适用于字符串
为什么这是一个问题?在您的筛选器中,
f
是一个字符串。因为筛选器函数需要一个bollean返回,并且两者都返回一个字符串
matrches
不返回字符串,而是返回一个布尔值。不,您不需要。你可以只使用
f.matches(lineregex)
(非空
长度
测试是多余的,因为如果它们失败,那么regexp-matchyea代码现在是多余的,但是为什么这个代码不能正确工作呢?没有说它不能工作。我是在评论“需要看起来像这样”不,它不-
matches
更简单、更清晰。好的,谢谢。我现在使用matches。我认为它不起作用,因为我总是在lineregex的末尾放一个.r。但是这不是必需的。我现在用matches命令运行它。..thxNo,你不需要。你可以只使用
f.matches(lineregex)
(非空
和长度
测试是冗余的,因为如果它们失败,那么regexp matchyea代码现在也是冗余的,但是为什么这个代码不能正常工作?没有说它不能工作。我是在评论“需要看起来像这样”不,它不-
匹配
更简单、更清晰。好的,谢谢。我现在使用匹配。我认为它不起作用,因为我总是在lineregex的末尾放一个.r。但这不是必需的。我现在使用您的matches命令运行它。thxI可能会添加这一点,这取决于整个过程中此特定步骤的性能敏感性Roess,可以共享一个编译的正则表达式(调用<代码>编译模式.Matter(String).MatcSes())/>代码>而不是<代码>字符串。匹配(模式)。在更密集的场景中,人们甚至会考虑重用匹配器对象,而不仅仅是使用适当的线程安全措施的模式。(例如,在spark
rdd.mapPartitions
调用中重用匹配器):我可以补充一点,根据整个过程中此特定步骤的性能敏感性,人们可能更喜欢共享编译的正则表达式(调用
compiledPattern.matcher(string).matches()
),而不是
string.matches(pattern)在更密集的场景中,人们甚至会考虑重用匹配器对象,而不仅仅是使用适当的线程安全措施(例如,在Skase<代码> RDD中重用匹配器。