2016-08-22 4 views
0
val prefix = "ABC" 
val renamedColumns = df.columns.map(c=> df(c).as(s"$prefix$c")) 
val dfNew = df.select(renamedColumns: _*) 

こんにちは、 のすべての列にプレフィックスを追加し、私はスカラ座にかなり新しいですし、上記のコードはすべての列にプレフィックスを追加するために完璧に動作します。誰かがそれがどのように機能するのか説明してください。 。のために_ *最後にデータフレーム:Scalaの

感謝: 2行目は上記などABCcol1、ABCcol2としてCOL2 .... 私はトラブル三行目が何をしているのか理解している、とespecailly」COL1のマップを返します。事前にあなたの助け。

+1

[スカラムでは何がparam:\ _ \ *を意味しますか?](http://stackoverflow.com/questions/7938585/what-does-param-mean-in-scala) –

答えて

3

三行目はScalaのシンタックスシュガーの一例である。基本的に、Scalaはあなたが入力しているだけで正確に何を短縮する方法を持っている、とあなたは恐ろしい:_*を発見した。

ありますこの小さなビットの2つの部分 - :_*は2つの異なる目的を果たす。 :は、通常、帰納法であり、コンパイラに "これはこのメソッドで使用する必要がある型です"と伝えます。しかしながら、_*はあなたのタイプです - これは、型varargsです。 Varargsは任意の数の値を持つ型です(良いリソースhere)。これは、要素数を知らないメソッドを渡すことを可能にします。

この例では、元のデータフレームの列から新しい文字列の別名を使用してrenamedColumnsという変数を作成しています。あなたのdfに含まれるカラムの数だけ知っているかもしれませんが、Scalaはそうではありません。 dfNewを作成すると、それに対してselect文を実行していて、新しい列名を渡しています。その中には任意の数値がある可能性があります。 基本的には、いくつのカラムがあるのか​​わからないので、varargsを渡してその数を任意にすることができるので、コンパイラによって決定されます。

関連する問題