2016-12-21 38 views
2

我正在使用Spark 1.6.1。比方說,我的數據幀的樣子:根據同一行中的其他列動態選擇列內容

+------------+-----+----+ 
|categoryName|catA |catB| 
+------------+-----+----+ 
|  catA |0.25 |0.75| 
|  catB |0.5 |0.5 | 
+------------+-----+----+ 

categoryName有字符串類型,cat*是雙。我想補充一點,將包含列值的名字是在categoryName列列:

+------------+-----+----+-------+ 
|categoryName|catA |catB| score | 
+------------+-----+----+-------+ 
|  catA |0.25 |0.75| 0.25 | ('score' has value from column name 'catA') 
|  catB |0.5 |0.7 | 0.7 | ('score' value from column name 'catB') 
+------------+-----+----+-------+ 

我需要這種提取一些以後計算。有任何想法嗎?

重要提示:我不知道類別列的名稱。解決方案需要是動態的。

回答

3

星火2.0: 你可以這樣做(爲任意數量的類別列)通過創建一個包含categroyName - > categoryValue的地圖的臨時列,然後從中選擇:

// sequence of any number of category columns 
val catCols = input.columns.filterNot(_ == "categoryName") 

// create a map of category -> value, and then select from that map using categoryName: 
input 
    .withColumn("asMap", map(catCols.flatMap(c => Seq(lit(c), col(c))): _*)) 
    .withColumn("score", $"asMap".apply($"categoryName")) 
    .drop("asMap") 

火花1.6:類似的想法,但使用陣列和UDF從中選擇:

// sequence of any number of category columns 
val catCols = input.columns.filterNot(_ == "categoryName") 

// UDF to select from array by index of colName in catCols 
val getByColName = udf[Double, String, mutable.WrappedArray[Double]] { 
    case (colName, colValues) => 
    val index = catCols.zipWithIndex.find(_._1 == colName).map(_._2) 
    index.map(colValues.apply).getOrElse(0.0) 
} 

// create an array of category values and select from it using UDF: 
input 
    .withColumn("asArray", array(catCols.map(col): _*)) 
    .withColumn("score", getByColName($"categoryName", $"asArray")) 
    .drop("asArray") 
1

您有幾種選擇:

  1. 如果您正在使用Scala的,你可以使用DataSet API在這種情況下,你會簡單地創建一個地圖,做了計算。
  2. 您可以從數據幀到RDD移動和使用地圖
  3. 您可以創建接收所有相關的列作爲輸入UDF和裏面做
  4. 計算,你可以用一堆時/否則條款做搜索(例如,當(COL1 == CATA,山坳(CATA))否則(COL(中CatB))。)
+0

1)數據集API是由火花2.0.0,是嗎?我正在使用1.6.1 2.)嗯,也許我會檢查它。 3.)但是我會丟失udf裏面的列名上下文,對不對? 4.)不動態 –

+0

spark 1.6.1在scala中有數據集API(它在2.0中進行了更改)。移動到UDF時,可以通過設置順序來使用列名。 –

相關問題