2017-12-28 17 views
1

ich eine einfache Funken Funktion haben DF Windowing zu testen:SBT Test funktioniert nicht für die Funkenprüfung

import org.apache.spark.sql.{DataFrame, SparkSession} 

    object ScratchPad { 

     def main(args: Array[String]): Unit = { 
     val spark = SparkSession.builder().master("local[*]").getOrCreate() 
     spark.sparkContext.setLogLevel("ERROR") 
     get_data_frame(spark).show() 
     } 

     def get_data_frame(spark: SparkSession): DataFrame = { 
     import spark.sqlContext.implicits._ 
     val hr = spark.sparkContext.parallelize(List(
      ("Steinbeck", "Sales", 100), 
      ("Woolf", "IT", 99), 
      ("Wodehouse", "Sales", 250), 
      ("Hemingway", "IT", 349) 
     ) 
     ).toDF("emp", "dept", "sal") 

     import org.apache.spark.sql.expressions.Window 
     import org.apache.spark.sql.functions._ 

     val windowspec = Window.partitionBy($"dept").orderBy($"sal".desc) 


     hr.withColumn("rank", row_number().over(windowspec)) 

     } 
    } 

Und ich schrieb ein Test wie so:

import com.holdenkarau.spark.testing.DataFrameSuiteBase 
    import org.apache.spark.sql.Row 
    import org.apache.spark.sql.types._ 
    import org.scalatest.FunSuite 

    class TestDF extends FunSuite with DataFrameSuiteBase { 

     test ("DFs equal") { 
     val expected=sc.parallelize(List(
      Row("Wodehouse","Sales",250,1), 
      Row("Steinbeck","Sales",100,2), 
      Row("Hemingway","IT",349,1), 
      Row("Woolf","IT",99,2) 
     )) 

     val schema=StructType(
      List(
      StructField("emp",StringType,true), 
      StructField("dept",StringType,true), 
      StructField("sal",IntegerType,false), 
      StructField("rank",IntegerType,true) 
     ) 
     ) 

     val e2=sqlContext.createDataFrame(expected,schema) 
     val actual=ScratchPad.get_data_frame(sqlContext.sparkSession) 
     assertDataFrameEquals(e2,actual) 
     } 

}

Works Gut, wenn ich mit der rechten Maustaste auf die Klasse intellij klicke und auf "run" klicke. Wenn ich den gleichen Test mit „sbt-Test“ ausführen, schlägt es mit den folgenden:

java.security.AccessControlException: access denied 
    org.apache.derby.security.SystemPermission("engine", 
    "usederbyinternals") 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 
     at java.security.AccessController.checkPermission(AccessController.java:884) 
     at org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(Unknown Source) 
     ... 

Und hier ist mein SBT Skript, nichts Besonderes-hatte hive Abhängigkeit setzen in, andernfalls wird der Test nicht kompilieren würde:

name := "WindowingTest" 

    version := "0.1" 

    scalaVersion := "2.11.5" 


    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.1" 
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.1" 
    libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.2.1" 
    libraryDependencies += "com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test" 

Google-Suche zeigt mir Derby-6648 (https://db.apache.org/derby/releases/release-10.12.1.1.cgi)

die sagt: Anwendung Änderungen erforderlich Benutzer, die Derby unter einem Security laufen muss die Politik fil bearbeiten e und gewähren Sie folgende zusätzliche Rechte an derby.jar, derbynet.jar und derbyoptionaltools.jar:

Erlaubnis org.apache.derby.security.SystemPermission "engine", "usederbyinternals";

Da ich das Derby nicht explizit installiert habe (wahrscheinlich intern von funken verwendet), wie mache ich das?

+0

Das gleiche Problem hier nach 2.2.0 Upgrade -> 2.2.1 – Daimon

+0

Können Sie laufen 'Funken shell' und führen' spark.range (5) .show'? Geht das für dich? –

+0

Dies funktionierte wie erwartet-ich bekam + --- + | ID | + --- + | 0 | | 1 | | 2 | | 3 | | 4 | + --- + – user1113782

Antwort

0

Folowing quick and dirty Hack das Problem

System.setSecurityManager(null) 

Auf jeden Fall löst, da es nur auf automatisierte Tests in engem Zusammenhang steht vielleicht ist es nicht so problematisch, nachdem alle;)

+0

Das hat es für mich gelöst - und ja, da es sich um einen automatisierten Test handelt, ist es in Ordnung. Das größere Problem bleibt jedoch noch. – user1113782

+0

Schließlich endete mit: override implizit def enableHiveSupport: Boolean = false was funktioniert – user1113782

+0

Es würde nur funktionieren, wenn Sie nicht verwenden Hive-Funktionen :) – Daimon

0

Standardmäßig verwenden Hive zwei Metastores ersten Meta-Speicherdienst und zweitens die standardmäßig aufgerufene Datenbank metastore_db und es verwendet Derby. also denke ich, dass du denby mit bive installieren und konfigurieren musst. Aber ich habe nicht die Verwendung von Bienenstock in Ihrem Code gesehen. Ich hoffe, meine Antwort hilft Ihnen

+0

Richtig, musste Stock verwenden sonst das Test-Framework (DataframesuiteBase) nicht kompilieren. Ich benutze keinen Bienenstock. – user1113782

0

diese Zeile hinzufügen in der Testklasse zu deaktivieren für mich hive

arbeitete
 override implicit def enableHiveSupport: Boolean = false 

es hier Got:

https://github.com/holdenk/spark-testing-base/issues/148

+0

Das ist in Ordnung, solange Sie nicht tatsächliche Hive-Emulation während der Tests benötigen. In einigen Fällen müssen Sie die Hive-Unterstützung aktivieren und trotzdem Tests ausführen können :) – Daimon

Verwandte Themen