Я пытаюсь groupBy
имя столбца host
и агрегировать среднее значение столбца типа ArrayType(StringType)
после приведения типа к ArrayType(IntegerType)
.
Выдает ниже ошибки
`cannot resolve `avg(variables)` due to datatype mismatch: function average requires numeric types, not ArrayType(IntegerType,true);
Входные данные - образец кадра данных перед группировкой
|request|time |type |host |service | variables |
|REST |1542111483170|RESTFUL|KAFKA|www.google.com|[Duration, 7,Type] |
|REST |1542111486570|RESTFUL|KAFKA|www.google.com|[Duration, 9, Type]|
Как преобразовать или обработать ArrayType (StringType) в IntegerType, т.е. переменные столбца имеют значение ArrayType(varaible.variable:String,varaible.value:String,varaible.TypeString)
Я хочу преобразовать 2-е значение массива varaible.value
в Integer для агрегации (среднее вычисление)?
Класс корпуса:
case class ServiceActivity(val request: String, val time: Long, val Type: String, val host: String, val service: String, val variables: Array[Variables])
case class Variables(val variable: String, val value: String, val Type: String)
Код ниже:
val report = df.select("*").where(array_contains(df("variables.variable"),"Duration"))
val intermediate = report.withColumn("variables", col(variables.value).cast(org.apache.spark.sql.types.ArrayType(org.apache.spark.sql.types.IntegerType,true)
intermediate.withColumn("duration",$"variables".getItem(2)).drop("variables").withColumnRenamed("duration","variables")
Код GroupBy (ошибка):
intermediate.groupBy(intermediate("host")).agg(Map("variables"->"avg"))
Любые обходные пути.
Спасибо