2017-02-23 72 views
0

一些字符串我有火花和Scala工作,看到在在线文档

df.select($"name", $"age" + 1).show() 

下面是什么$“名”的意思是在这里吗?

+0

http://docs.scala-lang.org/overviews/core/string-interpolation.html –

+0

这个问题是不是重复另一个。 – puhlen

+0

他们都在问''''符号的作用,并且_both_会误解它是Scala语法而不是Spark方法。 –

回答

3

这不是一个斯卡拉的事情。

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

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

宁可火花的事情,这似乎represent a column

org.apache.spark.sql.SQLImplicits代码在这里,

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

你可以简单地做dataframe.select("columnname").showdataframe.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] 

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

dataframe.filter($"age" > 28).show() 

所以,基本上,你这是它(Column类型)的变量与Spark中的$""

Scala有${}而串联变量,(又名String interpolation

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

scala> println(s"value = $printMe") 
value = prayagupd 
+1

高超的解释。非常感谢 – user373201