В режиме искровой пряжи я объявил переменную SparkSession
в объекте scala следующим образом:
</p>
<code>object ScalaTest {
// will raise java.lang.NoClassDefFoundError: Could not initialize class ScalaTest
val sparkConf = new SparkConf().setAppName("Scala Test")
val hiveCtx = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()
def mapKeyWord(rows: Iterator[Row]): Iterator[Row] = {
for (row <- rows) yield {
Row(key_word, pv)
}
}
def getData(hiveCtxArg: SparkSession): Unit = {
val hiveCtx = hiveCtxArg
val sqlQuery = """select key_word, sum(pv) as pv from test_table group by key_word"""
val dfRDD = hiveCtx.sql(sqlQuery).rdd.mapPartitions(mapKeyWord)
println("Count of rdd: %s".format(dfRDD.count))
}
def main(args: Array[String]): Unit = {
// SparkSession should declared here
// val sparkConf = new SparkConf().setAppName("Scala Test")
// val hiveCtx = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()
getData(hiveCtx)
println("Jobs done.")
}
}
</code>
После отправки в Spark с режимом пряжи, приведенный выше кодвызовет java.lang.NoClassDefFoundError: Не удалось инициализировать класс ScalaTest.Однако в локальном режиме код работает нормально.
Я предполагаю, что переменные, определенные в объекте, являются статическими и инициализируются только один раз в драйвере?