2017-03-01 61 views
2

我有以下問題的值到一個特定的列:含有col1處理字符串AB,或C映射基於annother柱

  • DataFrame。第二個col2Integer
  • 和另外三列col3,col4col5(這些欄也被命名爲ABC)。

因此,

col1 - col2 - A (col3) - B (col4) - C (col5) 
|-------------------------------------------- 
    A  6 
    B  5 
    C  6 

應該獲得

col1 - col2 - A (col3) - B (col4) - C (col5) 
|-------------------------------------------- 
    A  6  6 
    B  5     5 
    C  6        6 

現在我想要經過的每一行,並分配整數col2基於該列A,B或C輸入col1

我該如何做到這一點?

df.withColumn()我不能使用(或者至少我不知道爲什麼),並且同樣適用於val df2 = df.map(x => x)

期待您的幫助,並提前致謝!

最佳,肯

回答

2

創建關鍵和目標列之間的映射:

val mapping = Seq(("A", "col3"), ("B", "col4"), ("C", "col5")) 

用它來生成列的順序:

import org.apache.spark.sql.functions.when 

val exprs = mapping.map { case (key, target) => 
    when($"col1" === key, $"col2").alias(target) } 

前置明星和選擇:

val df = Seq(("A", 6), ("B", 5), ("C", 6)).toDF("col1", "col2") 
df.select($"*" +: exprs: _*) 

結果是:

+----+----+----+----+----+ 
|col1|col2|col3|col4|col5| 
+----+----+----+----+----+ 
| A| 6| 6|null|null| 
| B| 5|null| 5|null| 
| C| 6|null|null| 6| 
+----+----+----+----+----+