我有一个类似下面的架构,它是collect_list
groupby
的输出
root
|
|-- usedServiceUnits: array (nullable = true)
| |-- element: string (containsNull = true)
|-- accumulators: array (nullable = true)
| |-- element: string (containsNull = true)
此处的值如下所示
+----------------+
|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。对于函数不同的更多字段,我需要类似的计算。所以基本上我正在寻找如何将其传递给我的函数或在哪里更改?
提前感谢您的建议。
答案 0 :(得分:1)
这适用于字符串数组,根据您的问题使用UDF
val getSumOf = udf((value : Seq[String]) => value.map(_.toInt).sum.toString)
abc.withColumn("usedServiceUnits1",udf(getSumOf($"usedServiceUnits"))
希望这对你有效。
答案 1 :(得分:0)
根据我的理解,我建议您使用udf
功能
将udf
函数定义为
def sumAllValuesinString = udf((inString: mutable.WrappedArray[String]) => {
var sum = 0
val DELIM =','
for ( x <- inString){
sum += Integer.parseInt(x)
}
sum.toString()
})
然后使用udf
作为
withColumn
函数
abc.withColumn("usedServiceUnits1", sumAllValuesinString($"usedServiceUnits"))
我希望这是你需要的