这个问题在这里已经有答案了:
“:*”(冒号-下划线-星形)在scala中做什么(4个答案)
六个月前关门了。
当看到一些同事的scala spark代码时,有时我会遇到他们使用列表来过滤Dataframe,如本例所示:
val myList: List[String] = List("0661", "0239", "0949", "0380", "0279", "0311")
df.filter(col("col1").isin(myList:_*)
上面的代码工作得很好,但是这个代码没有:
df.filter(col("col1").isin(myList)
我不明白的是,那“星星”是什么 :_*
你到底在干什么?
提前谢谢!
3条答案
按热度按时间pftdvrlh1#
如果任何方法包含
repeated parameter
. 如果你想通过任何考试Iterable
在方法的repeated parameter
,以转换Iterable to repeated parameter
您将使用:_*
```def x(y:Int*):Seq[Int]={ // y:Int* is a repeated parameter.
y
}
x(List(1,2,3,4):_*) <--- you are passing List into repeated parameter
ej83mcc02#
这有时被称为
splat
接线员。它用于调整序列(array、list、seq、vector等),以便将其作为varargs方法参数的参数传递:7d7tgy0s3#
它的意思是“传递列表作为一个单独的参数”。它适用于具有vararg参数的方法,如“任意数量的字符串”,但不适用于
List[String]
版本。Spark
isin
函数有签名isin(list: Any*): Column
,Any*
表示“任意类型的任意数量的参数”。不是很有描述性,但是在这里您可以传递任意数量的字符串,或者任意数量的列。与:_*
语法,你对编译器说“用varargs替换我的列表”,这等同于写.isin("0661", "0239" ...)
另外,由于spark 2.4.0isInCollection
,这需要Iterable
,所以你可以通过List
就在那里。