Spark Scala:使用 $ 符号的功能差异?

use*_*916 2 scala apache-spark apache-spark-sql

以下两个表达式之间是否存在功能差异?结果对我来说看起来一样,但很好奇是否有未知的未知数。该$符号表示什么/如何读取?

df1.orderBy($"reasonCode".asc).show(10, false)
    
df1.orderBy(asc("reasonCode")).show(10, false)
Run Code Online (Sandbox Code Playgroud)

mik*_*ike 7

这两个语句是等效的,将导致相同的结果。

$符号是 Scala Spark 的特殊符号,它指的是一种隐式StringToColumn方法,它将后续字符串“reasonCode”解释为Column

implicit class StringToColumn(val sc: StringContext) {
  def $(args: Any*): ColumnName = {
    new ColumnName(sc.s(args: _*))
  }
}
Run Code Online (Sandbox Code Playgroud)

在 Scala Spark 中,您有多种选择列的方法。我在另一个答案中写下了完整的语法变体列表,关于从 spark dataframe 中选择特定列

使用不同的符号不会对性能产生任何影响,因为它们都通过 Spark 的 Catalyst 优化器转换为同一组 RDD 指令。

  • 据我所知,这都是语法糖,最终它被 Spark 的 Catalyst 优化器翻译/编译为相同的 RDD 指令。 (2认同)