我想提高我的星火代碼:優化星火代碼
var lst = disOneRDDM.filter(x=> x._2._1 == 1).keys.collect
val disTwoRDDM = disOneRDDM.map(x=> {
var b:Boolean = false
breakable{
for (str <- x._2._2)
if (lst.contains(str))
{b = true
break}
}
if (b)
(x._1,(Math.min(2,x._2._1),x._2._2))
else
x
}).cache
我有形式的RDD的(字符串,(智力,列表[字符串]))。 List[String]
中的每個元素在此RDD中都有其自己的條目,可用作關鍵字。樣品輸入如下所示(這是disOneRDDM
在我的代碼):
("abc",(10,List("hij","efg","klm")))
("efg",(1,List("jhg","Beethan","abc","ert")))
("Beethan",(0,List("efg","vcx","zse")))
("vcx",(1,List("czx","Beethan","abc")))
("zse",(1,List("efg","Beethan","nbh")))
("hij",(10,List("vcx","klm","zse")))
("jhg",(10,List("ghb","cdz","awq","swq")))
...
我的意圖是在每個List[String]
其中具有1的Int
值和元件的查找並改變其自己的Int
到min(2,current_Int_value)
。例如,在輸入代碼中,條目具有包含"efg"
的列表,其具有Int
值1,並且條目"hij"
具有"vcx"
。所以,我希望形式的輸出:
("abc",(2,List("hij","efg","klm")))
("efg",(1,List("jhg","Beethan","abc","ert")))
("Beethan",(0,List("efg","vcx","zse")))
("vcx",(1,List("czx","Beethan","abc")))
("zse",(1,List("efg","Beethan","nbh")))
("hij",(2,List("vcx","klm","zse")))
("jhg",(10,List("ghb","cdz","awq","swq")))
...
的RDD的規模是巨大的,我做了它的工作方式,但速度很慢。在上面的代碼中,我試圖過濾具有Int
值1的RDD並通過收集它們來形成列表lst
。然後,爲了找到值爲2的元素,我遍歷元素的列表條目並檢查列表lst
是否包含條目。如果是這樣,我打破循環並分配適當的Int
值。
有沒有更快的方法來做到這一點,例如,不必收集列表中的巨大RDD?
LST是來自一個列表RDD,所以我認爲它有點大。你正在做的是對disOneRDDM中的每一行進行迭代。此外,對於映射中的每個單獨分區,該列表都不會被廣播,因此該列表將被序列化並分發。我會將lst轉換爲Set並播放它。 –