2016-09-05 39 views
1

我試圖將函數應用於笛卡爾RDD。該功能採取from here,我不知道如何使它在笛卡爾RDDs上工作。將函數應用於笛卡爾RDD

val combined = rdd_valid.cartesian(rdd1) 
combined.collect().foreach(a => println(a)) 

(abcde,abdce) 
(somethin,somthing) 
(afghr, decsvt) 

我首先想到的是做

val newRDD = combined.map(Levenshtein.distance) 

但它不工作。

回答

5

假設combined有型RDD[(String, String)],並Levenshtein.distance有這樣的簽名:

def distance(s1:String, s2:String) 

如下您可以應用它:

val newRDD = combined.map { case (s1, s2) => Levenshtein.distance(s1, s2) } 

,或者:

val newRDD = combined.map(t => Levenshtein.distance(t._1, t._2)) 
+0

是。這就是它。謝謝。在這種情況下'case'做了什麼? – Sotos

+0

它是'combined.map(t => t match {case(s1,s2)=> Levenshtein.distance(s1,s2)}'的語法糖(或簡寫),這意味着它是匹配每條記錄的模式匹配表達式在RDD中元組爲'(s1,s2)'。 –

+0

非常感謝您的幫助。非常感謝。 – Sotos