Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么$不能处理String类型的值(并且只能直接处理String文本)?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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