首页 > 解决方案 > 为什么 IntelliJ IDEA 不能识别标准函数和 $s?

问题描述

我使用 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()
  )
}

有什么遗漏吗?导入语句还是附加库?

标签: scalaapache-sparkintellij-ideaapache-spark-sql

解决方案


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绑定到输入 DataFrame (这看起来更干净而且......极客:))。

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)。


推荐阅读