【问题标题】:Why does Scala compiler fail with "object SparkConf in package spark cannot be accessed in package org.apache.spark"?为什么 Scala 编译器因“无法在包 org.apache.spark 中访问包 spark 中的对象 SparkConf”而失败?
【发布时间】:2015-12-05 17:35:06
【问题描述】:

我无法访问包中的SparkConf。但我已经导入了import org.apache.spark.SparkConf。我的代码是:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD

import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._

object SparkStreaming {
    def main(arg: Array[String]) = {

        val conf = new SparkConf.setMaster("local[2]").setAppName("NetworkWordCount")
        val ssc = new StreamingContext( conf, Seconds(1) )

        val lines = ssc.socketTextStream("localhost", 9999)
        val words = lines.flatMap(_.split(" "))
        val pairs_new = words.map( w => (w, 1) )
        val wordsCount = pairs_new.reduceByKey(_ + _)
        wordsCount.print() 

        ssc.start() // Start the computation
        ssc.awaitTermination() // Wait for the computation to the terminate

    }
}

sbt 依赖项是:

name := "Spark Streaming"

version := "1.0"

scalaVersion := "2.10.4"

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.5.2" % "provided",
    "org.apache.spark" %% "spark-mllib" % "1.5.2",
    "org.apache.spark" %% "spark-streaming" % "1.5.2"
)

但是错误显示SparkConf无法访问。

[error] /home/cliu/Documents/github/Spark-Streaming/src/main/scala/Spark-Streaming.scala:31: object SparkConf in package spark cannot be accessed in package org.apache.spark
[error]         val conf = new SparkConf.setMaster("local[2]").setAppName("NetworkWordCount")
[error]                        ^

【问题讨论】:

    标签: scala apache-spark sbt


    【解决方案1】:

    如果你在 SparkConf 后面加上括号,它会编译:

    val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")

    关键是 SparkConf 是一个类而不是一个函数,因此您也可以将类名用于范围目的。因此,当您在类名后添加括号时,您要确保调用的是类构造函数而不是作用域功能。这是一个来自 Scala shell 的示例,说明了不同之处:

    scala> class C1 { var age = 0; def setAge(a:Int) = {age = a}}
    defined class C1
    
    scala> new C1
    res18: C1 = $iwC$$iwC$C1@2d33c200
    
    scala> new C1()
    res19: C1 = $iwC$$iwC$C1@30822879
    
    scala> new C1.setAge(30)  // this doesn't work
    
    <console>:23: error: not found: value C1
              new C1.setAge(30)
                  ^
    
    scala> new C1().setAge(30) // this works
    
    scala> 
    

    【讨论】:

      【解决方案2】:

      在这种情况下,你不能省略括号,所以应该是:

      val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
      

      【讨论】:

        猜你喜欢
        • 2018-04-05
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 2014-11-14
        • 2016-06-25
        • 2011-06-17
        相关资源
        最近更新 更多