Почему IntelliJ IDEA не распознает стандартные функции и $ s? - PullRequest
0 голосов
/ 07 июня 2018

Я использую Spark 2.3.0.

Следующий фрагмент кода отлично работает в spark-shell:

def transform(df: DataFrame): DataFrame =  {
  df.select(
    explode($"person").alias("p"),
    $"history".alias("h"),
    $"company_id".alias("id")
  )

Однако при редактировании в Intellij он не распознает select, explode и $ функции.Это мои зависимости в SBT:

version := "1.0"
scalaVersion := "2.11.8"

libraryDependencies ++= {
  val sparkVer = "2.1.0"
  Seq(
    "org.apache.spark" %% "spark-core" % sparkVer % "provided" withSources(),
    "org.apache.spark" %% "spark-sql" % sparkVer % "provided" withSources()
  )
}

Чего-то не хватает?Оператор импорта или дополнительная библиотека?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

В Intellij нет доступной библиотеки spark.implicits._, поэтому функция explode выдает ошибку.Не забудьте создать объект SparkSession.builder () перед импортом.

Примените следующий код, это работает:

 val spark = SparkSession.builder()
      .master("local")
      .appName("ReadDataFromTextFile")
      .getOrCreate()

    import spark.implicits._

    val jsonFile = spark.read.option("multiLine", true).json("d:/jsons/rules_dimensions_v1.json")
    jsonFile.printSchema()

    //jsonFile.select("tag").select("name").show()
    jsonFile.show()

    val flattened = jsonFile.withColumn("tag", explode($"tag"))
    flattened.show()
0 голосов
/ 07 июня 2018

Вы должны использовать следующий метод импорта в методе 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).

...