首页 > 解决方案 > Spark SQL Dataframes - 在连接的 where 子句中使用 $columnname 在 spark-shell 中工作但不能编译

问题描述

当我在 spark-shell 中给出以下 Spark SQL 语句时,它工作正常。但是当我尝试使用 sbt 构建 jar 文件时,同样的语句在构建时给出了错误。

val df3=df1.join(df2).where($"columnname1" === $"columnname2")

什么是理由?

我得到的错误是: value $ is not a member of StringContext

我正在导入以下内容。我是否需要专门为构建导入任何其他内容?

import org.apache.spark.sql.SparkSession

import org.apache.spark.sql.functions._

到目前为止,我按如下方式更改了该行,并且它构建良好并且运行良好。

val df3=df1.join(df2).where(df1("columnname1") === df2("columnname2"))

我想知道为什么早期的语法在构建中不起作用以及我在构建中缺少什么。

标签: scaladataframeapache-sparkapache-spark-sql

解决方案


不要忘记import implicits已经导入的spark-shell.

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

import spark.implicits._ 

文件:

  /**
   * Converts $"col name" into a [[Column]].
   *
   * @since 2.0.0
   */
  implicit class StringToColumn(val sc: StringContext) {
    def $(args: Any*): ColumnName = {
      new ColumnName(sc.s(args: _*))
    }
  }

推荐阅读