【问题标题】:How to filter out alphanumeric strings in Scala using regular expression如何使用正则表达式过滤掉Scala中的字母数字字符串
【发布时间】:2015-11-03 21:33:45
【问题描述】:

我想从我的文件中过滤掉字母数字和数字单词。我正在研究 Spark-Shell。这些是我的文件 sparktest.txt 的内容:

这是 1 个文件,而不是 54783。你想把这个文件写成 Writt3n 吗? HDFS?

定义要收集的文件:

scala> val myLines = sc.textFile("sparktest.txt")

将该行保存到一个长度大于 2 的单词的数组中:

scala> val myWords = myLines.flatMap(x => x.split("\\W+")).filter(x => x.length >2)

定义要使用的正则表达式。我只想要匹配“[A-Za-z]+”的字符串:

scala> val regexpr = "[A-Za-z]+".r

尝试过滤掉字母数字和数字字符串:

scala> val myOnlyWords = myWords.map(x => x).filter(x => regexpr(x).matches)
<console>:27: error: scala.util.matching.Regex does not take parameters
       val myOnlyWords = myWords.map(x => x).filter(x => regexpr(x).matches)

这就是我卡住的地方。 我希望结果如下所示:

Array[String] = Array(This, file, not, Will, you, this, file, HDFS)

【问题讨论】:

    标签: regex scala hadoop apache-spark


    【解决方案1】:

    您实际上可以在一次转换中执行此操作,并在您的flatMap 中过滤拆分数组:

    val myWords = myLines.flatMap(x => x.split("\\W+").filter(x => x.matches("[A-Za-z]+") && x.length > 2))
    

    当我在 spark-shell 中运行它时,我看到:

    scala> val rdd1 = sc.parallelize(Array("This is 1 file not 54783. Would you l1ke this file to be Writt3n to HDFS?"))
    rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[11] at parallelize at <console>:21
    
    scala> val myWords = rdd1.flatMap(x => x.split("\\W+").filter(x => x.matches("[A-Za-z]+") && x.length > 2))
    myWords: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[12] at flatMap at <console>:23
    
    scala> myWords.collect
    ...
    res0: Array[String] = Array(This, file, not, Would, you, this, file, HDFS)
    

    【讨论】:

    • 太棒了!谢谢。一条线也有效!我喜欢使用&amp;&amp;。我喜欢逐行编码,但我很快意识到将命令组合在一行中的吸引力。谢谢!为什么你使用 sc.parallelize 而不是 sc.textFile?
    • parallelize 方法在 RDD 中分发一个集合,因此只需分发一个包含示例字符串的集合,而不是从文件中加载它。 parallelize 和 textFile 方法都有不同的用途。如果答案有效(亚历山大也是),请随意投票,以便人们知道它是正确的。
    • 再次感谢@Rohan Aletty。关于大数据和 Hadoop 的未来,我可以通过私信联系您吗?
    【解决方案2】:

    您可以使用filter(x =&gt; regexpr.pattern.matcher(x).matches)filter(_.matches("[A-Za-z]+"))

    【讨论】:

    • 谢谢!两者都有效。我更喜欢filter(_.matches("[A-Za-z]+"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多