簡體   English   中英

Scala刪除IF Else語句並以功能方式編寫

[英]Scala removing IF Else statement and write in a functional way

假設我有以下元組

(colType, colDocV)

其中colType是一個布爾值,而colDocV是一個String取決於這兩個值,我將應用一些代碼塊,這些代碼將轉換應用於Dataframe。

現在,此代碼有效。 但是,我不認為這是編寫功能編程代碼的正確方法。 我不知道這3種方法中的哪一種可以提高代碼的質量並刪除所有if-if else-else:我應該采用某種設計模式,哪種設計模式? 我應該使用某種模式匹配嗎? 我應該使用一些匿名功能嗎?

if (colDocV) {
  val newCol = udf(UDFHashCode.udfHashCode).apply(col(columnName))
  dataframe.withColumn(columnName, newCol)
} else if (colType.contains("string") || colType.contains("text")) {
  val newCol = udf(Entropy.stringEntropyFunc).apply(col(columnName)).cast(DoubleType)
  dataframe.withColumn(columnName, newCol)
} else if (colType.contains("date")) {
  val newCol = udf(DateUtils.getTimeAsDoubleFunc).apply(col(columnName)).cast(DoubleType)
  dataframe.withColumn(columnName, newCol)
} else if (colType.contains("long")) {
  dataframe.withColumn(columnName, dataframe(columnName).cast(DoubleType) )
} else {
  dataframe.drop(columnName) //Dropping column that cannot be processed
}

您可以使用match語句和一堆正則表達式來做到這一點。

val str = ".*(?:string|text).*".r
val date = ".*date.*".r
val long = ".*long.*".r

def col(tuple: (Boolean, String)) = tuple match {
  case (true, _) => Some(udf(...))
  case (_, str()) => Some(udf(...))
  case (_, date()) => Some(udf(...))
  case (, long()) => Some(udf(...))
    case _ => None
}
col(colType -> colDocv)
 .fold(dataframe.drop(columnName)) { newCol => 
    dataframe.withColumn(columnName, newCol)
 }

根據我從您的問題中了解的內容,以下內容可以是使用match case的解決方案

def callUdf(colDocV: String, colType: Boolean, dataframe: DataFrame) = (colDocV, colType) match {
  case x if (x._1.contains("string") || x._1.contains("text")) => dataframe.withColumn(columnName, udf(Entropy.stringEntropyFunc).apply(col(columnName)).cast(DoubleType))
  case x if (x._1.contains("date")) => dataframe.withColumn(columnName, udf(DateUtils.getTimeAsDoubleFunc).apply(col(columnName)).cast(DoubleType))
  case x if (x._1.contains("long")) => dataframe.withColumn(columnName, dataframe(columnName).cast(DoubleType) )
  case _ => dataframe.drop(columnName)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM