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如果这解决了您的问题,您可以接受它-请参阅。