私は以下のようなコードを持っています
オブジェクトErrorTest { case class APIResults(status:String、col_1:Long、col_2:Double、...) def funcA(rows:ArrayBuffer [ Row])(implicit defaultFormats:DefaultFormats):ArrayBuffer [APIResults] = { //いくつかのAPIを呼び出して結果を取得し、APIResults ... } [.____を返します。 ] //マーク:プロパティの読み込み val props = loadProperties() private def loadProperties():プロパティ= { val configFile = new File( "config .properties ") val reader = new FileReader(configFile) val props = new Properties() props.load(reader) props } def main(args:Array [String]):Unit = { val prop_a = props.getProperty( "prop_a") val session = Context.initialSparkSession(); import session.implicits ._ val initialSet = ArrayBuffer.empty [Row] val addToSet =( s:ArrayBuffer [Row]、v:Row)=>(s + = v) val mergePartitionSets =(p1:ArrayBu ffer [Row]、p2:ArrayBuffer [Row])=>(p1 ++ = p2) val sql1 = s "" " select * from tbl_a where ... "" " session.sql(sql1) .rdd.map {row => {implicit val format = DefaultFormats; (row.getLong(6)、row)}} 。aggregateByKey(initialSet)(addToSet、mergePartitionSets) .repartition(40) .map {case(rowNumber、rows )=> {暗黙のval形式= DefaultFormats; funcA(rows)}} 。flatMap(x => x) .toDF() .write.mode(SaveMode.Overwrite).saveAsTable( "tbl_b") } }
_spark-submit
_を介して実行すると、エラーがスローされます原因:Java.lang.NoClassDefFoundError:クラスstaging_jobs.ErrorTest $を初期化できませんでした。しかし、val props = loadProperties()
をmain
メソッドの最初の行に移動すると、エラーは発生しなくなります。誰かがこの現象について説明してもらえますか?どうもありがとう!
_Caused by: Java.lang.NoClassDefFoundError: Could not initialize class staging_jobs.ErrorTest$
at staging_jobs.ErrorTest$$anonfun$main$1.apply(ErrorTest.scala:208)
at staging_jobs.ErrorTest$$anonfun$main$1.apply(ErrorTest.scala:208)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
at org.Apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
at org.Apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.Java:43)
at org.Apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:377)
at org.Apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.execute(FileFormatWriter.scala:243)
at org.Apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:190)
at org.Apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:188)
at org.Apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1341)
at org.Apache.spark.sql.execution.datasources.FileFormatWriter$.org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:193)
... 8 more
_
私はあなたと同じ質問に出会った。 convert
メソッドの外にメソッドmain
を定義しました。 main
のdataframe.rdd.map{x => convert(x)}
と一緒に使用すると、NoClassDefFoundError:Could not initialize class Test$
起こりました。
しかし、convertor
メソッドでconvert
メソッドと同じコードである関数オブジェクトmain
を使用すると、エラーは発生しませんでした。
spark 2.1.0、scala 2.11、sparkのバグのようですか?
問題は、val props = loadProperties()
が(mainの)外部クラスのメンバーを定義していることだと思います。次に、このメンバーは、ドライバーを使用した保存環境を持たないエグゼキューターでシリアル化(または実行)されます。