Преобразование ArrayType (StringType) в IntegerType в кадре данных искры - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь 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"))

Любые обходные пути.

Спасибо

1 Ответ

0 голосов
/ 15 ноября 2018

Разбирается, разбивая массив и используя concat_ws метод

  val splitArray = ab.withColumn("Avg_Duration", concat_ws("", ab("variables.value")))

  splitArray.groupBy(splitArray("host")).agg(Map("Avg_Duration" -> "avg")).show(false)

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...