在 withColumn 函数下使用匿名函数的 Scala 中单撇号(')的符号的含义?

Meaning of the Symbol of single apostrophe(') in Scala using Anonymous function under withColumn function?

我的问题是:

第5行:单撇号(')的操作是什么?不能很清楚地理解 withColumn 函数在这里是如何工作的。还请详细说明它是如何像这样显示的 Column order- |id |text |upper |.

代码:

 1. val dataset = Seq((0, "hello"),(1, "world")).toDF("id","text")
 2. val upper: String => String =_.toUpperCase
 3. import org.apache.spark.sql.functions.udf
 4. val upperUDF = udf(upper)
 5. dataset.withColumn("upper", upperUDF('text)).show

输出:

+---------+---------+---------+
|id       |text     |upper    |
+---------+---------+---------+
| 0       | hello   |HELLO    |
| 1       | world   |WORLD    |
+---------+---------+---------+

Scala 中的 ' 符号是用于创建 Symbol 实例的语法糖。 class。来自文档

For instance, the Scala term 'mysym will invoke the constructor of the Symbol class in the following way: Symbol("mysym").

所以当你写'text的时候,编译器会把它展开成new Symbol("text").

这里还有额外的魔法,因为 Sparks upperUDF 方法需要 Column 类型,而不是 Symbol。但是,在 SQLImplicits 中定义了一个隐含的作用域,称为 symbolToColumn,它将一个符号转换为一个列:

implicit def symbolToColumn(s: Symbol): ColumnName = new ColumnName(s.name)

如果我们提取掉所有的隐式和语法糖,等价物将是:

dataset.withColumn("upper", upperUDF(new Column(new Symbol("text").name))).show