【问题标题】:Closure not working in Filter method闭包在过滤器方法中不起作用
【发布时间】:2015-09-21 10:42:51
【问题描述】:

我写下以下内容的印象是,line 在迭代和过滤多行文本时是某种关键字。但是我在编译时出错。我知道Spark 代码中的line 字是在其他上下文中使用的,这就是我的代码不起作用的原因。我已经开始学习 Scala 两天了。所以请耐心等待我对语法和俚语的了解。

有人可以解释为什么line 在 Spark 代码中工作而不是在普通的 scala 代码中工作吗?除了 line 在 spark 和简单的 scala 代码中,它也可以是其他东西。

纯 Scala 代码:

val myString = """Hello world line 1
      line 2
      Line 3""";

 println(myString.filter(line => line.contains(3)));
                                   ^^^^^^ error here

火花代码:

val sc = new SparkContext(conf) val logData = sc.textFile(logFile, 2).cache() val numAs = logData.filter(line => line.contains("a")).count()

【问题讨论】:

  • 遇到错误时,不要只说“有错误”。包括实际的错误消息——它包含很多关于可能出错的信息。那么,您收到的错误信息是什么? line 不是 Scala 中的关键字或保留字。

标签: scala collections apache-spark


【解决方案1】:

line 只是您要绑定的变量的名称,它在普通 Scala 和 Spark 中都没有什么特别之处。

我对 Spark 了解不多,但我相信 logData.filter 函数是一个迭代多行字符串的行并通过行上的某个谓词过滤它们的函数; logData 在这种情况下不是字符串,而是一些 Spark 提供的类。

当您改用为String 提供的Scala 的filter 函数时,您正在迭代字符,因此您绑定的line 变量是Char 类型,它没有contains 函数.

如果你想遍历一个普通的 Scala 字符串,你可以这样做:

yourString.split("\n").filter(line => line.contains('3'))

split 位生成包含行的Array[String],然后您可以过滤数组;在这种情况下,行的类型是 String'3' 的类型必须是 Char 才能按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2018-02-27
    • 2020-05-31
    • 2017-04-04
    • 2011-05-24
    相关资源
    最近更新 更多