scala 如何将元素列表单独传递给函数调用?

fcipmucu  于 2023-05-29  发布在  Scala
关注(0)|答案(1)|浏览(241)

我试图利用Databricks struct() function,它单独接受列,如struct(c1,c2,c3)。但是我想向函数传递一个列列表,或者通过其他方法获得类似的结果。

val keyList = List("key1", "key2")

df
.select(
  struct(keyList).as("key")
...

我的Dataframe包含列key 1,key 2,我想将它们一起包含在struct()中。我想我可以使用类似keyList:_* 的东西,但显然该函数不是 *-参数化的。有什么建议可以让我做到这一点吗?

xzv2uavs

xzv2uavs1#

TLDR,使用这个:

df
.select(struct(keyList.map(col(_)): _*).as("key"))) ..

Docs的定义如下:

def struct(colName: String, colNames: String*): Column

def struct(cols: Column*): Column

我们可以使用unpack操作符将list传递给varargs(带 * 的参数):_*
因此,对于第一个接受string的函数,我们需要一个参数是string,第二个可以是varargs。对于后者,我们可以传递List of Columns。
这两个都应该工作:

df.select(struct("id", df.columns.filterNot(_.startsWith("id")): _*)).show()

df.select(struct(df.columns.map(col(_)): _*)).show()

输入:

+---+----------+-----+
| id|         A|value|
+---+----------+-----+
|  a|    vowels|    1|
|  b|consonants|    2|
|  c|consonants|    3|
|  d|consonants|    4|
|  e|    vowels|    5|
+---+----------+-----+

输出:

+--------------------+
|struct(id, A, value)|
+--------------------+
|      {a, vowels, 1}|
|  {b, consonants, 2}|
|  {c, consonants, 3}|
|  {d, consonants, 4}|
|      {e, vowels, 5}|
+--------------------+

相关问题