2016-06-29 4 views
9

実際にスキーマを変更するために、データフレーム内の列の位置を変更できるかどうか疑問に思っていましたか?スパークデータフレームの列の位置を変更するにはどうすればよいですか?

私は[field1、field2、field3]のようなデータフレームを持っていて、[field1、field3、field2]を取得したいと思っています。

ご協力いただければ幸いです。

ありがとうございました。

編集:コードを挿入することはできません。 いくつかの結合と変換の後に、100個の列を持つデータフレームで作業しているとしましょう。これらの列の一部は、宛先テーブルのスキーマに関して誤って配置されています。 私の要点は、1つまたは複数の列を移動する方法、つまりスキーマを変更する方法です。

ありがとうございました。

+0

これまでに行った努力を示すコードを記入してください。 http://stackoverflow.com/help/how-to-ask –

+0

データフレームは変更不可能なので、あなたが何をしても新しいものが返されます。ほとんどの場合、私はあなたがこれをやることを避けることができると思います。 – Jeff

+1

ここに正確に何を期待していますか?この時点ではむしろあいまいです。 – zero323

答えて

22

あなたは、カラム名を取得する、しかし、あなたが望むそれらを並べ替え、その後にselectを使用することができますこの新しい順に新しいものを得るために、元のデータフレーム:小さな異なるバージョンが@Tzachゾハルと比較

val columns: Array[String] = dataFrame.columns 
val reorderedColumnNames: Array[String] = ??? // do the reordering you want 
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*) 
+0

すべての答えに感謝、すべてが動作します!それにもかかわらず、私はスキーマではなくカラム名を扱うことに困惑しています。乾杯。 –

+0

本当に助かります!良い解決策。感謝する!!! – anand

2

他の人がコメントしたように、名前で列を照会できるときに順序が関係しないので、なぜこれを行うのかが分かりました。列を感じを与える必要があります選択を使用してとにかく

は、スキーマの説明に移動している:

val data = Seq(
    ("a",  "hello", 1), 
    ("b",  "spark", 2) 
) 
.toDF("field1", "field2", "field3") 

data 
.show() 

data 
.select("field3", "field2", "field1") 
.show() 
+2

多分私は間違っていますが、.writeメソッドを使ってハイブテーブルにパーティションを追加すると、名前ではなく位置によって書き込むようです。その場合、私は非常に満足しています:) –

+0

SparkContext.unionを使用すると、RDDベースの共用体はスキーマを無視するので、その場合は列の順序をオーバーライドする必要があります。 –

+0

ユニオン。列がすべて同じであっても、注文は重要です。私は2つのデータセットのスキーマとしてケースクラスを設定しましたが、カラムの順序は異なります。組合が働くのに合うように注文を設定しなければならなかった。 –

2

val cols = df.columns.map(df(_)).reverse 
val reversedColDF = df.select(cols:_*) 
1

spark-dariaライブラリは、データフレームの列の順序を変更することが容易になりますreorderColumns方法があります。

import com.github.mrpowers.spark.daria.sql.DataFrameExt._ 

val actualDF = sourceDF.reorderColumns(
    Seq("field1", "field3", "field2") 
) 

reorderColumns方法は、ボンネットの下@Rockieヤンの溶液を使用します。

あなたがdf2の列の順序を等しくなるようにdf1の列の順序を取得したい場合は、このようなものは、すべての列をハードコーディングするよりも良いが動作するはずです:

df1.reorderColumns(df2.columns) 

spark-dariaライブラリはまたにsortColumns変換を定義します列を昇順または降順にソートします(シーケンス内のすべての列を指定しない場合)。

import com.github.mrpowers.spark.daria.sql.transformations._ 

df.transform(sortColumns("asc")) 
関連する問題