在 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
我的问题是:
第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