2016-02-11 8 views
6

私はSpark 1.6でデータフレームを持っており、そこからいくつかの列を選択したいと考えています。私は特定の列を選択するには、このように行うことができます知っている共通のラベルで始まるすべての列を選択する方法

colA, colB, colC, colD, colE, colF-0, colF-1, colF-2 

:列名が似ている

df.select("colA", "colB", "colE") 

が、どのように、選択して「で、colA」、「COLB」と言うと、すべてのcolF-します*列はすぐに? Pandasのような方法がありますか? df.columnsと列名が、その後、あなたが.filter(_.startsWith("colF"))をしたいだけの列名に絞り込む

答えて

9

まずグラブ。これにより、一連の文字列が得られます。しかし、選択にはselect(String, String*)が必要です。幸いなことにカラムを選択するのはselect(Column*)なので、最後にストリングを.map(df(_))でカラムに変換し、最後にカラムの配列を: _*のvar argに変えてください。

df.select(df.columns.filter(_.startsWith("colF")).map(df(_)) : _*).show 

このフィルタは、さらに複雑にすることができます(パンダと同じ)。他の列のリストは、あなたがまた、フィルタ配列を持つ列名の固定された配列をマージすることができ、固定されている場合は

df.select(df.columns.filter(x => (x.equals("colA") || x.startsWith("colF"))).map(df(_)) : _*).show 

:しかしそれは(IMO)ではなく醜いソリューションです。

df.select((Array("colA", "colB") ++ df.columns.filter(_.startsWith("colF"))).map(df(_)) : _*).show 
+0

質問に記載されているように他の列も選択していただきありがとうございます。 – user299791

+0

私の問題の正確な解決策は、2番目と3番目のソリューションが混在しています...ありがとうございます。トピックを完全にマスターしてください – user299791

関連する問題