Scala 为什么$不能处理String类型的值(并且只能直接处理String文本)?
我有以下模拟枚举的对象:Scala 为什么$不能处理String类型的值(并且只能直接处理String文本)?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有以下模拟枚举的对象: object ColumnNames { val JobSeekerID = "JobSeekerID" val JobID = "JobID" val Date = "Date" val BehaviorType = "BehaviorType" } 然后我想把一个DF按列分组。以下内容未编译: userJobBehaviourDF.groupBy($(ColumnNames.JobSeekerID)) 如果我把它改成
object ColumnNames {
val JobSeekerID = "JobSeekerID"
val JobID = "JobID"
val Date = "Date"
val BehaviorType = "BehaviorType"
}
然后我想把一个DF按列分组。以下内容未编译:
userJobBehaviourDF.groupBy($(ColumnNames.JobSeekerID))
如果我把它改成
userJobBehaviourDF.groupBy($"JobSeekerID")
它起作用了
如何将
$
和ColumnNames.JobSeekerID
一起使用来执行此操作?如果要使用ColumnNames
,则只能将$
与字符串文字(值)一起使用,您可以执行以下操作
userJobBehaviourDF.groupBy(userJobBehaviourDF(ColumnNames.JobSeekerID))
userJobBehaviourDF.groupBy(col(ColumnNames.JobSeekerID))
从中,以下是表示列的不同方式:
希望这有帮助
$
是一种称为的Scala功能
从Scala2.10.0开始,Scala提供了一种从数据创建字符串的新机制:字符串插值。字符串插值允许用户将变量引用直接嵌入已处理的字符串文本中
Spark利用Spark SQL中的字符串内插器来实现
ColumnName
type是Column
type的子类型,这就是为什么可以使用$
-前缀字符串作为列引用,其中需要Column
type的值
import org.apache.spark.sql.Column
val c: Column = $"columnName"
scala> :type c
org.apache.spark.sql.Column
如何将$和ColumnNames.jobsekerId一起使用来执行此操作
你不能
您应该直接使用$
将列名(在“枚举器”中)映射到列
类型(这需要将其类型更改为列
),或者在需要列时使用or函数
col(colName:String):Column返回基于给定列名的列
column(colName:String):column返回基于给定列名的列
$
s其他地方
有趣的是Spark MLlib使用$
-前缀字符串作为ML参数,但在本例中是$
还值得一提的是,(另一个)$
字符串插值器用于创建逻辑unsolvedAttributes
,这可能对测试或Spark SQL内部探索有用
import org.apache.spark.sql.catalyst.dsl.expressions._
scala> :type $"hello"
org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute
Scala中的字符串插值器
字符串插值器功能在编译时工作(被解析为正确的值),因此它要么是字符串文字,要么将失败
$
类似于s
:
将s
前置到任何字符串文字允许直接在字符串中使用变量
Scala提供了三种现成的字符串插值方法:s
、f
和raw
,您可以像Spark那样编写自己的插值器。谢谢您的回答。是否引用了“仅将$与字符串文字(值)一起使用”?顺便说一句,有点不同将字符串文字转换为ColumnName对象,而col()将字符串转换为Column对象。还有一个org.apache.spark.sql.functions.lit()函数。lit()和col()是否相同?谢谢。你可以在这里看到列的表示。哦,我想我弄错了。lit()是“创建一列文字值”。它是不同的。有趣的是,Column
函数没有列出,不是吗?是的,以前没有注意到。
import org.apache.spark.sql.Column
val c: Column = $"columnName"
scala> :type c
org.apache.spark.sql.Column
protected final def $[T](param: Param[T]): T = getOrDefault(param)
import org.apache.spark.sql.catalyst.dsl.expressions._
scala> :type $"hello"
org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute