2017-05-25 21 views
1

我有一個架構如下圖所示,這是在這個groupby星火不能調用一個函數形式.Withcolumn

root 
| 
|-- usedServiceUnits: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- accumulators: array (nullable = true) 
| |-- element: string (containsNull = true) 

價值觀的collect_list輸出看起來像下面

+----------------+ 
|usedServiceUnits| 
+----------------+ 
|[180, 180, 1] |==> this is an array of String 
|[180, 180, 1] | 
+----------------+ 

我得叫def在這個領域像

abc.select("serviceId", "recordId", "usedServiceUnits") 
.withColumn("usedServiceUnits1",lit(sumAllValuesinString($"usedServiceUnits")) 

def sumAllValuesinString(inString: String): String= { 
var sum = 0 
val DELIM =',' 
val a = splitString(inString,DELIM) 
for (x <- a){ 
    sum += Integer.parseInt(x) 
} 
sum.toString() 

}

我怎樣才能調用這個函數,並得到sum作爲返回並設置到我的新列--usedServiceUnits1。對於功能不同的更多領域,我需要進行類似的計算。所以基本上我正在尋找如何將此傳遞給我的函數或在哪裏更改?

在此先感謝您的建議。

回答

1

這適用於字符串數組,使用UDF根據您的問題

val getSumOf = udf((value : Seq[String]) => value.map(_.toInt).sum.toString) 
abc.withColumn("usedServiceUnits1",udf(getSumOf($"usedServiceUnits")) 

希望這將是對你有效。

0

據我瞭解您的要求,我會建議你使用udf功能

定義udf功能

def sumAllValuesinString = udf((inString: mutable.WrappedArray[String]) => { 
    var sum = 0 
    val DELIM =',' 
    for (x <- inString){ 
    sum += Integer.parseInt(x) 
    } 
    sum.toString() 
}) 

然後調用使用withColumn作爲

abc.withColumn("usedServiceUnits1", sumAllValuesinString($"usedServiceUnits")) 

我的udf功能希望這是你需要的東西

+0

謝謝Ramesh,這對我很有用。 –