Вы должны использовать следующий метод импорта в методе transform
(чтобы было доступно explode
):
import org.apache.spark.sql.functions._
Вы также можете сделать следующее, чтобы быть точным в том, что вы импортируете.
import org.apache.spark.sql.functions.explode
Работает в spark-shell
, поскольку выполняет импорт по умолчанию (поэтому вам не нужно беспокоиться о таких простых вещах:)).
scala> spark.version
res0: String = 2.3.0
scala> :imports
1) import org.apache.spark.SparkContext._ (69 terms, 1 are implicit)
2) import spark.implicits._ (1 types, 67 terms, 37 are implicit)
3) import spark.sql (1 terms)
4) import org.apache.spark.sql.functions._ (354 terms)
Что касается $
он также импортируется по умолчанию в spark-shell
для вашего удобства.Добавьте следующее, чтобы оно было в вашем методе.
import spark.implicits._
В зависимости от того, где вы определили метод transform
, вы можете добавить неявный параметр к методу transform
следующим образом (и пропустить добавление import
выше):
def transform(df: DataFrame)(implicit spark: SparkSession): DataFrame = {
...
}
Однако я бы предпочел использовать SparkSession
, привязанный к входному фрейму данных (который выглядит чище и ... geeker:)).
def transform(df: DataFrame): DataFrame = {
import df.sparkSession.implicits._
...
}
В качестве бонуса я бы также очистил ваш build.sbt
, чтобы он выглядел следующим образом:
libraryDependencies += "org.apache.spark" %% "spark-sql" % 2.1.0" % "provided" withSources()
Вы не будете использовать артефакты из spark-core
в своих приложениях Spark SQL (иэто транзитивная зависимость spark-sql
).