为什么IntelliJ IDEA无法识别标准功能和$ s?

时间:2018-06-07 11:00:11

标签: scala apache-spark intellij-idea apache-spark-sql

我使用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中进行编辑时,它将无法识别selectexplode$函数。这些是我在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 :(得分:2)

您应该使用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(这看起来更干净,更......极客:)。

def transform(df: DataFrame): DataFrame =  {
  import df.sparkSession.implicits._
  ...
}

作为奖励,我还要清理你的build.sbt,所以它看起来如下:

libraryDependencies += "org.apache.spark" %% "spark-sql" % 2.1.0" % "provided" withSources()

您不会在Spark SQL应用程序中使用spark-core中的工件(并且它是spark-sql的传递依赖项)。

答案 1 :(得分:0)

Intellij没有可用的spark.implicits._库,因此爆炸引发错误。请记住在导入之前创建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()