Scala函数式编程干运行

Scala函数式编程干运行,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,请您帮助我理解以下方法: def extractGlobalID(custDimIndex :Int)(gaData:DataFrame) : DataFrame = { val getGlobId = udf[String,Seq[GenericRowWithSchema]](genArr => { val globId: List[String] = genArr.toList .filter(_(0) == custDimIndex)

请您帮助我理解以下方法:

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))
}

该方法将UDF应用于数据帧。UDF似乎打算从类型为
数组的列中提取单个ID,其中结构的第一个元素是索引,第二个元素是ID

您可以将代码重写为更具可读性:

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))
}

你想知道关于它的什么?只是我还是这段相当糟糕的代码?当然
collectFirst
然后是
fold
会更干净更快吗?@Jay1991如果这解决了您的问题,您可以接受它-请参阅。