簡體   English   中英

Apache Spark-實現分布式QuadTree

[英]Apache Spark - Implementing a distributed QuadTree

我真的是Apache Spark的新手。

我正在通過Spark在分布式方式上實現近似檢測LOCI(或ALOCI),一種異常檢測算法。 此算法基於將點存儲在QuadTree中,該點用於查找點的鄰居數。

我確切地知道QuadTrees是如何工作的。 實際上,最近我已經用Java實現了這樣的結構。 但是,關於這種結構可以在Spark上以分布式方式工作的方式,我完全迷失了。

我可以在Geospark中找到類似的東西。

https://github.com/DataSystemsLab/GeoSpark/tree/b2b6f1d7f0015d5c9d663a7b28d5e1bb1043c413/core/src/main/java/org/datasyslab/geospark/spatialPartitioning/quadtree

在許多情況下,GeoSpark使用PointRDD類,該類擴展了SpatialRDD類,我可以看到該類使用可以在上面的鏈接中找到的QuadTree對Spatial對象進行分區。 至少從理論上講,這就是我的理解。

實際上,我仍然無法弄清楚。 例如,假設我在一個csv中有數百萬條記錄,而我想在QuadTree中讀取並加載它們。

我可以讀取CSD到RDD,但是那又如何呢? 該RDD如何在邏輯上連接到我要構建的QuadTree?

當然,我不希望這里有可行的解決方案。 我只需要這里的邏輯來填補我的空白。 如何實現分布式QuadTree以及如何使用它?

好的,很遺憾,對此沒有答案,但是兩個星期后,我有了一個可行的解決方案。 但是,不能100%地確定這是否是正確的方法。

我創建了一個名為Element的類,並將csv的每一行都轉換為RDD [Element]。 然后,我創建了一個名為QuadNode的可序列化類,該類具有大小為4的List [Elements]和Array [String]。將元素添加到節點時,這些元素將添加到節點的List中。 如果列表中有X個以上的元素(在本例中為20個),則該節點分為4個子元素,並將這些元素發送給這些子元素。 最后,我創建了一個類QuadTree,在其其余屬性中具有RDD [QuadNodes]。 每次節點斷開給子節點,然后將這些子節點添加到樹的RDD中。

在非功能性語言中,每個節點將具有4個指針,每個子節點一個。 由於我們處於分布式環境中,因此這種方法行不通。 因此,我給每個節點一個唯一的ID。 根節點的ID =“ 0”。 根節點的ID為“ 00”,“ 01”,“ 02”和“ 03”。 節點“ 00”的子代的標識為“ 000”,“ 001”,“ 002”,“ 003”。 這樣,如果我們想找到一個節點的所有后代,則可以通過檢查節點的id是否在沒有節點id的情況下開始過濾樹的RDD [QuadNode]。 逆轉此邏輯有助於我們找到節點的父節點。

至少到目前為止,這就是我實現QuadTree的方式。 如果有人知道更好的實施方法,我希望聽聽他/她的意見。

暫無
暫無

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

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