2016-08-25 5 views
21

मैं spark.implicits._ आयात करने की कोशिश कर रहा हूं जाहिर है, यह स्केल में कक्षा के अंदर एक वस्तु है। जब मैं तो जैसे एक विधि में आयात:scala में spark.implicits._ आयात करना

def f() = { 
    val spark = SparkSession().... 
    import spark.implicits._ 
} 

यह ठीक काम करता है, फिर भी मैं एक परीक्षण वर्ग लिख रहा हूँ और मैं सभी परीक्षणों मैंने कोशिश की है इस आयात उपलब्ध कराना चाहते हैं:

class SomeSpec extends FlatSpec with BeforeAndAfter { 
    var spark:SparkSession = _ 

    //This won't compile 
    import spark.implicits._ 

    before { 
    spark = SparkSession().... 
    //This won't either 
    import spark.implicits._ 
    } 

    "a test" should "run" in { 
    //Even this won't compile (although it already looks bad here) 
    import spark.implicits._ 

    //This was the only way i could make it work 
    val spark = this.spark 
    import spark.implicits._ 
    } 
} 

न केवल यह बुरा दिखता है, मैं इसे प्रत्येक टेस्ट के लिए नहीं करना चाहता हूं इसे करने का "सही" तरीका क्या है?

+0

फ़ाइल के शीर्ष पर क्यों नहीं? आम तौर पर सभी आयात – spiffman

+2

कोशिश करते हैं कि कोड में लिखना भूल गए, लेकिन स्पष्ट रूप से यह संभव नहीं है क्योंकि "implicits" "स्पार्क" वर्ग के अंदर एक वस्तु है और इसे पहले तत्काल करने की आवश्यकता है – ShinySpiderdude

उत्तर

8

आप स्पार्क परीक्षण सूट में किए गए कार्यों के समान कुछ कर सकते हैं। उदाहरण के लिए इस काम करेगा (SQLTestData से प्रेरित):

class SomeSpec extends FlatSpec with BeforeAndAfter { self => 

    var spark: SparkSession = _ 

    private object testImplicits extends SQLImplicits { 
    protected override def _sqlContext: SQLContext = self.spark.sqlContext 
    } 
    import testImplicits._ 

    before { 
    spark = SparkSession.builder().master("local").getOrCreate() 
    } 

    "a test" should "run" in { 
    // implicits are working 
    val df = spark.sparkContext.parallelize(List(1,2,3)).toDF() 
    } 
} 

वैकल्पिक रूप से आप SharedSQLContext सीधे की तरह कुछ है, जो एक testImplicits: SQLImplicits प्रदान करता है, यानी उपयोग कर सकते हैं: मुझे लगता है

class SomeSpec extends FlatSpec with SharedSQLContext { 
    import testImplicits._ 

    // ... 

} 
8

SparkSession.scala फ़ाइल में GitHub कोड कर सकते हैं आप एक अच्छे संकेत दे:

 /** 
     * :: Experimental :: 
     * (Scala-specific) Implicit methods available in Scala for converting 
     * common Scala objects into [[DataFrame]]s. 
     * 
     * {{{ 
     * val sparkSession = SparkSession.builder.getOrCreate() 
     * import sparkSession.implicits._ 
     * }}} 
     * 
     * @since 2.0.0 
     */ 
     @Experimental 
     object implicits extends SQLImplicits with Serializable { 
     protected override def _sqlContext: SQLContext = SparkSession.this.sqlContext 
     } 
यहाँ

"चिंगारी" "spark.implicits._" में सिर्फ sparkSessi है ऑब्जेक्ट पर हमने बनाया है।

Here एक और संदर्भ है!

1

मैं स्पार्क सत्र को तुरंत चालू करता हूं और "आयात आयात" का उपयोग करने से पहले।

@transient lazy val spark = SparkSession 
    .builder() 
    .master("spark://master:7777") 
    .getOrCreate() 

    import spark.implicits._ 
संबंधित मुद्दे