2016-04-22 9 views
3

既存のデータフレームのスキーマを別のデータフレームのスキーマに変更しようとしています。スキーマをあるデータフレームから別のデータフレームにコピー

DATAFRAME 1:

Column A | Column B | Column C | Column D 
    "a" | 1  | 2.0 | 300 
    "b" | 2  | 3.0 | 400 
    "c" | 3  | 4.0 | 500 

は、データフレーム2:

Column K | Column B | Column F 
    "c" | 4  | 5.0 
    "b" | 5  | 6.0 
    "f" | 6  | 7.0 

だから私は、第二の最初のデータフレームのスキーマを適用したいです。したがって、同じ列はすべて残っています。 1にないデータフレーム2の列は削除されます。他は "NULL"になります。スキーマがString、INTとダブルが含まれているため、これは動作しません見ることができるよう

val schema = df1.schema 
val newRows: RDD[Row] = df2.map(row => { 
    val values = row.schema.fields.map(s => { 
    if(schema.fields.contains(s)){ 
     row.getAs(s.name).toString 
    }else{ 
     "NULL" 
    } 
    }) 
    Row.fromSeq(values) 
}) 
sqlContext.createDataFrame(newRows, schema)} 

Column A | Column B | Column C | Column D 
"NULL" | 4  | "NULL" | "NULL" 
"NULL" | 5  | "NULL" | "NULL" 
"NULL" | 6  | "NULL" | "NULL" 

出力は、だから私は、可能な解決策となりました。そして、私の行はすべてString値を持っています。

これは私が立ち往生しているところです。自動的に値のタイプをスキーマに変換する方法はありますか?

感謝

あなたは、単に左が、このようなクエリを使用してデータフレームに参加しない可能性があり

答えて

6

スキーマが平坦である場合、私は単にごとの既存のスキーマとselect必要な列の上にマッピングし使用します。返信用

val exprs = df1.schema.fields.map { f => 
    if (df2.schema.fields.contains(f)) col(f.name) 
    else lit(null).cast(f.dataType).alias(f.name) 
} 

df2.select(exprs: _*).printSchema 

// root 
// |-- A: string (nullable = true) 
// |-- B: integer (nullable = false) 
// |-- C: double (nullable = true) 
// |-- D: integer (nullable = true) 
+0

返信いただきありがとうございます!私はそれを試してみました、そして、それは私が必要としていたものでした! (まだupvoteできません) – RudyVerboven

0

: - この記事では、@ zero323で答えをチェックアウトしてください

SELECT Column A, Column B, Column C, Column D FROM foo LEFT JOIN BAR ON Column C = Column C

: -

Spark specify multiple column conditions for dataframe join

ありがとう、 チャールズ。

+0

おかげで、私は私の質問を編集しました。データフレームはリレーショナルではないことに注意することが重要です。 – RudyVerboven

関連する問題