Обходной путь для импорта искровых последствий везде

Я новичок в 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._

У меня пока работает нормально..

Другие вопросы по тегам