scala - 为什么 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()
)
}
有什么遗漏吗?导入语句还是附加库?
解决方案
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
)。
推荐阅读
- javascript - feathersjs:忽略数据库查询中的 url 查询参数
- python - 循环访问 API 请求以记录值
- c# - 模型抛出 System.InvalidCastException 上的 IDictionary 属性
- python - 使用 for 循环的多个水平堆积条形图
- python - 将我的代码中的结果打印到 .txt 不再起作用
- ruby-on-rails - 如何修复rails模型中的“SystemStackError(堆栈级别太深)”
- sql - Oracle 12c:ORDER BY 排序工作,除了回退机制
- python - 部署天蓝色函数(python)时找不到文件错误
- matplotlib - 使用 seaborn 的子图
- ionic4 - 在底部弹出