scala dataframe udf 函數(shù)總結(jié)

工作中需要對dataframe 寫出非常復(fù)雜的處理函數(shù)
使用udf 對單個(gè)函數(shù)進(jìn)行處理,使之可以對整列數(shù)據(jù)進(jìn)行處理。

示例一: 對兩列數(shù)據(jù)求cos(x,y)
這個(gè)是實(shí)際應(yīng)用的代碼
兩個(gè)問題
1.dataframe 里面的數(shù)據(jù)是vector格式的,兒喲啊進(jìn)行處理需要處理成Array格式的
2.對dataframe 進(jìn)行兩列處理,需要用UDF處理,udf函數(shù)的輸入是兩個(gè)同類型列

def cosineDistence(ve1: Vetor, Ve2:Vector): Double = {
    val v1 = ve1.toArray
    val v2 = ve2.toArray

    var distance = -1.0
    val vector  =v1.zip(v2)
    val x1x2 = vetor.map{ case (x1, x2) => x1 *x2}.sum
    var x1sum =  v1.map(x1 =>math.pow(x1, 2)).sum
    x1sum = math.pow(x1sum, 1.0/2)
    var x2sum = v2.map(x2 => math.pow(x2,2)).sum
    x2sum = math.pow(x2sum, 1.0/2)
    distance = x1x2 / (x1sum * x2sum)
    distance}

val udf_consineDistance = udf(consineDistence _)
 
val outcomes = output.limit(1).select($"feature" as "one").crossJoin(output)
val outcomes = outcomes.withColumn("test_result", udf_consineDistance($"one",$"feature"))

示例二:特定詞頻統(tǒng)計(jì)
四個(gè)問題:
1.如何對udf函數(shù)設(shè)置多個(gè)參數(shù),使用Curring 函數(shù)法則進(jìn)行處理,同時(shí)一定小心書寫格式,需要在等號左邊添加上自定義參數(shù)
2.函數(shù)輸出多個(gè)值,需要在函數(shù)定義處定義好輸出,輸出值應(yīng)該是對應(yīng)的
3.使用Option[T]進(jìn)行函數(shù)設(shè)計(jì),防止程序運(yùn)行崩潰,應(yīng)該正確的使用map
4.對dataframe進(jìn)行處理的時(shí)候需要注意udf的使用規(guī)則,這里面只有一個(gè)輸入列
5.在dataframe 使用filter判斷是否相等,應(yīng)用“===”
6.一定注意split(".")和split('.’)

def get_set(num: Int) :(Set[String], Set[String])={
    val input = scala.io.Source.fromFile(s"/home/zhuyin/words/${num}_line").getlines().toList
    val set1 = input(0).split(",").map(_.trim).toSet
    val set2 = input(1).split(",").map(_.trim).toSet
    (set1,set2)
}
(set1,set2) = get_set(1)
def KeywordsCount(set1: Set[String],Set2: Set[String])(str :String):Option[Int]={
    Option(str).map{ s=>
    val pro = s.split(" ").toSet
    val samewords1 = pro& set1
    val samewords2 = pro& set2
    val final1 = if(result.isEmpty) 0 else 1
    final1
  }
}
def CountAll(set1: Set[String], set2: Set[String])(str : String) : Option[Int] ={
  Option(str).map{ s =>
    val pro = s.split('.')
    val count = 0
    for(s<- pro){
    if(KeywordsCount(set1,set2)(s) == 1){count = 1}
      }
  count  
  }
}
def udf_KeywordCount(set1: Set[string], set2:Set[String]) = udf(CountAll(set1, sert2) _)

val df_final = df.withColumn("count1",udf_KeywordCount(set1,set2)($"descrip"))

df_final.filter(df_final("count1")===1).select("count1").count().toInt
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容