Scala функциональное программирование пробного запуска - PullRequest
0 голосов
/ 08 февраля 2019

Не могли бы вы помочь мне понять следующий метод:

def extractGlobalID(custDimIndex :Int)(gaData:DataFrame) : DataFrame = {
  val getGlobId = udf[String,Seq[GenericRowWithSchema]](genArr => {
    val globId: List[String] =
      genArr.toList
        .filter(_(0) == custDimIndex)
         .map(custDim => custDim(1).toString)

    globId match {
      case Nil => ""
      case x :: _ => x
    }
  })

  gaData.withColumn("globalId", getGlobId('customDimensions))
}

1 Ответ

0 голосов
/ 08 февраля 2019

Метод применяет UDF к кадру данных.Кажется, UDF предназначена для извлечения одного идентификатора из столбца типа array<struct>, где первый элемент структуры является индексом, а второй - идентификатором.

Вы можете переписать код, чтобы сделать его более читабельным:

def extractGlobalID(custDimIndex :Int)(gaData:DataFrame) : DataFrame = {
  val getGlobId = udf((genArr : Seq[Row]) => {
    genArr
      .find(_(0) == custDimIndex)
      .map(_(1).toString)
      .getOrElse("")
  })

  gaData.withColumn("globalId", getGlobId('customDimensions))
}

или даже короче с collectFirst:

def extractGlobalID(custDimIndex :Int)(gaData:DataFrame) : DataFrame = {
  val getGlobId = udf((genArr : Seq[Row]) => {
    genArr
      .collectFirst{case r if(r.getInt(0)==custDimIndex) => r.getString(1)}     
      .getOrElse("")
  })

  gaData.withColumn("globalId", getGlobId('customDimensions))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...