簡體   English   中英

將Scala方法轉換為Spark

[英]Converting a Scala method to Spark

下面的Scala方法返回Array的k個最近鄰居:

  def getNearestNeighbours(distances: Array[((String, String), Double)], k: Int, label: String) = {                    //| label: String)List[((String, String), Double)]

    distances.filter(v => v._1._1.equals(label) || v._1._2.equals(label)).sortBy(_._2).take(k)
  }

我想並行運行此功能。 我可以嘗試將Array轉換為RDD但類型RDD不支持函數.sortBy(_._2).take(k)是否可以在Spark / Scala中模擬此方法?

一種可能的解決方案是修改該方法,以便每次調用該方法時RDD都轉換為Array,但是我認為這對於大型RDD而言在計算上是昂貴的?

  def getNearestNeighbours(distances: RDD[((String, String), Double)], k: Int, label: String) = {                    //| label: String)List[((String, String), Double)]

    distances.collect.filter(v => v._1._1.equals(label) || v._1._2.equals(label)).sortBy(_._2).take(k)
  }

不要collect RDD。 它將所有數據拉到一台計算機上。 更改您的輸入,使其以距離為鍵( RDD[Double, (String, String)] ),然后使用RDD.top(k)

RDD確實具有sortByKey方法,該方法按第一個元素對對的RDD進行排序,因此,如果可以創建RDD[(Double, (String, String))]而不是RDD[((String, String), Double)] (或僅調用rdd.map(p => (p._2, p._1) ),您可以直接翻譯該算法。它也帶有take ,但是文檔中說:

返回具有數據集的前n個元素的數組。 請注意,當前這不是並行執行的。 相反,驅動程序會計算所有元素。

所以我認為這不會很好

此外,如果數據適合在一台計算機上,則僅使用數組(或並行集合)可能會更快。 Spark盡其所能使開銷最小化,但是無論如何,分布式排序都會有一些開銷!

另外,如果只需要最少的n元素,則對整個數組/ RDD /其他集合進行排序是一個壞主意(同樣,尤其是在您想使用Spark的情況下)。 您需要像最差情況O(n)算法中所述的選擇算法來進行k選擇,還是在具有N個元素的整數數組中找到最小k個元素? 不幸的是,它們在Scala標准庫或Spark(據我所知)中不可用。

暫無
暫無

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

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