2016-08-25 46 views
21

Spark.implicits._ dosyasını içe aktarmaya çalışıyorum Görünüşe göre, bu scala'da bir sınıfın içindeki bir nesnedir. Düzgün çalışırScalada spark.implicits._ içe aktarılıyor

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

Ancak ben bir test sınıfı yazıyorum ve ben denedim tüm testler için bu ithalat kullanılabilir yapmak istiyorum::

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._ 
    } 
} 
i şöyle bir yöntemde içe

Bu sadece kötü değil, her test için yapmak istemiyorum Bunu yapmanın doğru yolu nedir?

+0

Neden dosyanın en üstünde değilsiniz? Tipik olarak tüm ithalatlar – spiffman

+2

kodunda yazılmıştır. Ayrıca, kodda yazmayı unutmuş, ancak "implicits" in "spark" sınıfındaki bir nesne olması ve bunun ilk olarak başlatılması gerektiği için mümkün değildir. – ShinySpiderdude

cevap

8

Spark test süitlerinde yapılanlara benzer bir şey yapabilirsiniz. Örneğin bu (ilham SQLTestData tarafından) çalışacak:

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() 
    } 
} 

Alternatif yani testImplicits: SQLImplicits sağlar doğrudan SharedSQLContext gibi bir şey, kullanabilir: Bence

class SomeSpec extends FlatSpec with SharedSQLContext { 
    import testImplicits._ 

    // ... 

} 
8

SparkSession.scala dosyasında GitHub kod can

burada
 /** 
     * :: 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._" nde "kıvılcım" sadece sparkSessi geçerli: size iyi bir ipucu verebilir yarattığımız nesne.

Here başka bir referanstır!

1

Sadece SparkSession'ı başlatıyorum ve kullanmadan önce "import implicits" komutunu kullanıyorum.

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

    import spark.implicits._ 
İlgili konular