Dataframe:为Scala

时间:2016-08-22 14:40:08

标签: scala dataframe

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;:_ *。

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

第三行是Scala的语法糖的一个例子。从本质上讲,Scala有办法缩短你输入的内容,你发现了可怕的:_*

这个小位有两个部分 - :_*有两个不同的用途。 :通常用于归属,它告诉编译器“这是我需要用于此方法的类型”。然而,_*是你的类型 - 在Scala中这是类型varargs。 Varargs是一种具有任意数量值的类型(良好资源here)。它允许您传递一个方法,一个您不知道元素数量的列表。

在您的示例中,您将使用新的字符串附件从原始数据框的列创建名为renamedColumns的变量。虽然您可能知道df中有多少列,但Scala却没有。当您创建dfNew时,您正在运行一个select语句并传入新的列名,其中可能有任意数字。 基本上,您不知道可能有多少列,因此您传入varargs以允许数字是任意的,由编译器确定。