val prefix = "ABC"
val renamedColumns = df.columns.map(c=> df(c).as(s"$prefix$c"))
val dfNew = df.select(renamedColumns: _*)
您好, 我对scala相当新,上面的代码可以很好地为所有列添加前缀。有人可以解释一下它是如何工作的细分吗? 上面的第二行将返回col1的地图为ABCcol1,col2为ABCcol2 ....等 我无法理解第三行正在做什么,特别是最后的#34;:_ *。
感谢您的帮助。
答案 0 :(得分:7)
第三行是Scala的语法糖的一个例子。从本质上讲,Scala有办法缩短你输入的内容,你发现了可怕的:_*
。
这个小位有两个部分 - :
和_*
有两个不同的用途。 :
通常用于归属,它告诉编译器“这是我需要用于此方法的类型”。然而,_*
是你的类型 - 在Scala中这是类型varargs。 Varargs是一种具有任意数量值的类型(良好资源here)。它允许您传递一个方法,一个您不知道元素数量的列表。
在您的示例中,您将使用新的字符串附件从原始数据框的列创建名为renamedColumns
的变量。虽然您可能知道df中有多少列,但Scala却没有。当您创建dfNew时,您正在运行一个select语句并传入新的列名,其中可能有任意数字。
基本上,您不知道可能有多少列,因此您传入varargs以允许数字是任意的,由编译器确定。