Dob*_*leR 3 scala list dataframe underscore.js apache-spark
当看到一些同事的 Scala-Spark 代码时,有时我会遇到他们使用列表来过滤数据帧,如下例所示:
val myList: List[String] = List("0661", "0239", "0949", "0380", "0279", "0311")
df.filter(col("col1").isin(myList:_*)
Run Code Online (Sandbox Code Playgroud)
上面的代码工作得很好,但是,这个没有:
df.filter(col("col1").isin(myList)
Run Code Online (Sandbox Code Playgroud)
我不明白的是,那个“冒号下划线星”:_*
到底在做什么?
提前致谢!
它的意思是“将列表作为单独的参数传递”。它适用于具有 vararg 参数的方法,例如“任意数量的字符串”,但不适用于版本List[String]
。
Spark 的isin
函数有签名isin(list: Any*): Column
,Any*
意思是“任意数量的 Any 类型的参数”。描述性不是很强,但在这里您可以传递任意数量的字符串或任意数量的列。使用:_*
语法,您对编译器说“用可变参数替换我的列表”,它相当于编写.isin("0661", "0239" ...)
另外,从 Spark 2.4.0 开始,有 function isInCollection
,需要Iterable
,所以你可以List
直接传递到那里。
这有时称为splat
运算符。它用于调整序列(数组、列表、序列、向量等),因此它可以作为可变参数方法参数的参数传递:
def printAll(strings: String*):Unit = {
strings.foreach(println)
}
val fruits = List("apple", "banana", "cherry")
printAll(fruits:_*)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
612 次 |
最近记录: |