【问题标题】:Meaning of the Symbol of single apostrophe(') in Scala using Anonymous function under withColumn function? [duplicate]在 Scala 中使用 withColumn 函数下的匿名函数的单撇号(')符号的含义? [复制]
【发布时间】:2018-01-20 01:30:48
【问题描述】:

我的问题是:

第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

输出:

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

【问题讨论】:

  • withColumn 如果传递给它的第一个参数在数据框中尚不存在,则创建一个新列。如果是这样,它会覆盖现有的列。 'text 用于选择名为text 的列。您也可以使用$"text"org.apache.spark.sql.functions.col(text) 代替'text。顺序是这样的,因为前两列是 idtextwithColumn附加 列,它将在最后添加。您需要先浏览文档。你会在那里发现很多有趣的东西。
  • @philantrovert 非常感谢

标签: scala apache-spark user-defined-functions anonymous-function


【解决方案1】:

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)

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

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

【讨论】:

  • 能否请您详细说明第 5 行。请
  • @BhaskarDas 我只是在答案中添加信息。立即查看。
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 2011-10-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多