2017-09-05 6 views
0

以下は、列名の前に付けるコードです。 1つまたは複数の主キー列を除外します。私のprimaryKeysは、1つ以上の主キーフィールドを含む文字列配列です。プライマリキー列以外のすべてのsparkデータフレーム列の接頭辞

val primaryKeys = args(2).split("-") 

val prefix = "w1." 
val renamedColumns = df.columns.map(c=> df(c).as(s"$prefix$c")) 
val dfNew = df.select(renamedColumns: _*) 

val prefix2 = "w2." 
val renamedColumns2 = df2.columns.map(c2=> df2(c2).as(s"$prefix2$c2")) 
val df2New = df2.select(renamedColumns2: _*) 

If it is just one column i was able to rename using withColumnRenamed but i am unable to do it if i have multiple primary columns. 

私はこの

for (primaryKey <- primaryKeys) { 
dfNew.withColumnRenamed("$PREFIX1"+s"${primaryKey}",s"$primaryKey").toDF() 
} 

ような何かをすることができません誰かが助けることができますか?

答えて

1

私が正しくあなたの質問を理解していれば、あなたは条件付きで次のように唯一の非主キー列の接頭辞renamedColumnsを組み立てることができます。

val df = Seq(
    ("1", "a", "c1", "d1"), 
    ("2", "b", "c2", "d2"), 
    ("3", "c", "c3", "d3") 
).toDF("pk1", "pk2", "col1", "col2") 

val primaryKeys = Array("pk1", "pk2") 
val prefix = "w1." 

val renamedColumns = df.columns.map(
    c => if (primaryKeys contains c) df(c).as(c) else df(c).as(s"$prefix$c") 
) 

val dfNew = df.select(renamedColumns: _*) 

dfNew.show 
+---+---+-------+-------+ 
|pk1|pk2|w1.col1|w1.col2| 
+---+---+-------+-------+ 
| 1| a|  c1|  d1| 
| 2| b|  c2|  d2| 
| 3| c|  c3|  d3| 
+---+---+-------+-------+ 
+0

感謝レオ。私はJava開発者であり、scalaを初めて使用しています。私の思考は、Javaがどのように働くかに大きく影響します。ここに質問が掲載されていない限り、どこでもこの種のソリューションを見つけるのは難しいです。これらを解決するのに役立つ本やコースを提案できますか? –

+0

私がお勧めするScalaの本の1つは、 'Martin Odersky'らによる' Programming in Scala'です。 OderskyはScalaの著者です。 –

関連する問題