scala中$ some字符串的输出是什么

use*_*201 4 scala

我正在使用spark和scala,并在在线文档中看到以下内容

df.select($"name", $"age" + 1).show()
Run Code Online (Sandbox Code Playgroud)

$"name"在这里意味着什么?

pra*_*upd 8

这不是scala的事情.

scala> val name = "something"
name: String = something

scala> println($"name")
<console>:12: error: value $ is not a member of StringContext
       println($"name")
               ^
Run Code Online (Sandbox Code Playgroud)

而是一个火花的东西,似乎代表一个专栏.

请参阅此处的org.apache.spark.sql.SQLImplicits代码,

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

你可以简单地做dataframe.select("columnname").show或者做dataframe.select(col("columnname")).show,但dataframe.select($"columnname")改变列值,就像你在你的例子中增加年龄一样.

例如.

给定一个数据帧,

 +----+-------+
 | age|   name|
 +----+-------+
 |null|Michael|
 |  30|   Andy|
 |  19| Justin|
 +----+-------+

scala> dataframe.select($"name".as('myname)).show()
+-------+
| myname|
+-------+
|Michael|
|   Andy|
| Justin|
+-------+

scala> dataframe.select("age"+1).show()
org.apache.spark.sql.AnalysisException: cannot resolve '`age1`' given input columns: [age, name];;
'Project ['age1]
Run Code Online (Sandbox Code Playgroud)

使用的其他示例$可以是基于列值的过滤器,

dataframe.filter($"age" > 28).show()
Run Code Online (Sandbox Code Playgroud)

所以,基本上,你在Spark 中使它成为一个变量(类型Column)$"".

Scala ${}在连接变量的同时(又名String interpolation)

scala> val printMe = "prayagupd"
printMe: String = prayagupd

scala> println(s"value = $printMe")
value = prayagupd
Run Code Online (Sandbox Code Playgroud)

  • 精辟的解释.非常感谢 (2认同)