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

2 scala anonymous-function user-defined-functions apache-spark

我的问题是:

第5行:单撇号(')符号的操作是什么?无法清楚地了解withColumn函数如何在这里工作.另外请详细说明它是如何显示这些列顺序 - | 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
Run Code Online (Sandbox Code Playgroud)

输出:

+---------+---------+---------+
|id       |text     |upper    |
+---------+---------+---------+
| 0       | hello   |HELLO    |
| 1       | world   |WORLD    |
+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 11

'Scala中的符号是用于创建实例的语法糖Symbol.类.从文档中

例如,Scala术语'mysym将以下列方式调用Symbol类的构造函数:Symbol("mysym").

因此,当您编写时'text,编译器会将其扩展为new Symbol("text").

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

implicit def symbolToColumn(s: Symbol): ColumnName = new ColumnName(s.name)
Run Code Online (Sandbox Code Playgroud)

如果我们提取掉所有的含义和语法糖,那么等价物将是:

dataset.withColumn("upper", upperUDF(new Column(new Symbol("text").name))).show
Run Code Online (Sandbox Code Playgroud)