Обходной путь для импорта искровых последствий везде
Я новичок в Spark 2.0 и использую наборы данных в нашей базе кода. Я как бы замечаю, что мне нужно import spark.implicits._
везде в нашем коде. Например:
File A
class A {
def job(spark: SparkSession) = {
import spark.implcits._
//create dataset ds
val b = new B(spark)
b.doSomething(ds)
doSomething(ds)
}
private def doSomething(ds: Dataset[Foo], spark: SparkSession) = {
import spark.implicits._
ds.map(e => 1)
}
}
File B
class B(spark: SparkSession) {
def doSomething(ds: Dataset[Foo]) = {
import spark.implicits._
ds.map(e => "SomeString")
}
}
Я хотел спросить, есть ли более чистый способ сделать это?
ds.map(e => "SomeString")
без импорта последствий в каждой функции, где я делаю карту? Если я не импортирую его, я получаю следующую ошибку:
Ошибка:(53, 13) Невозможно найти кодировщик для типа, сохраненного в наборе данных. Примитивные типы (Int, String и т. Д.) И типы Product (классы дел) поддерживаются путем импорта spark.implicits._ Поддержка сериализации других типов будет добавлена в будущих выпусках.
1 ответ
Что-то, что могло бы немного помочь, было бы сделать импорт внутри class
или же object
вместо каждой функции. Для ваших примеров "Файл A" и "Файл B":
File A
class A {
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
def job() = {
//create dataset ds
val b = new B(spark)
b.doSomething(ds)
doSomething(ds)
}
private def doSomething(ds: Dataset[Foo]) = {
ds.map(e => 1)
}
}
File B
class B(spark: SparkSession) {
import spark.implicits._
def doSomething(ds: Dataset[Foo]) = {
ds.map(e => "SomeString")
}
}
Таким образом, вы получаете управляемое количество imports
,
К сожалению, насколько мне известно, нет другого способа уменьшить количество импорта еще больше. Это связано с необходимостью SparkSession
объект при выполнении фактического import
, Следовательно, это лучшее, что можно сделать.
Вы можете повторно использовать существующий SparkSession в каждом вызываемом методе.. путем создания локального метода val внутри -
val spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession.active
А потом
import spark.implicits._
У меня пока работает нормально..