Spark无法调用函数表单.Withcolumn

时间:2017-05-25 07:56:41

标签: arrays scala apache-spark

我有一个类似下面的架构,它是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。对于函数不同的更多字段,我需要类似的计算。所以基本上我正在寻找如何将其传递给我的函数或在哪里更改?

提前感谢您的建议。

2 个答案:

答案 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"))

我希望这是你需要的