Graphx 查詢(xún)圖中的環(huán)

圖中環(huán)路檢測(cè)

一般是三色標(biāo)記,使用dfs 算法; 三種狀態(tài):

  • 未訪(fǎng)問(wèn) visited =0
  • 訪(fǎng)問(wèn),但子節(jié)點(diǎn)未訪(fǎng)問(wèn)完 visited=1
  • 全部訪(fǎng)問(wèn)绒净,visited =2;
    如果在訪(fǎng)問(wèn)過(guò)程中, dfs 下一個(gè)節(jié)點(diǎn)闪金,為visited=1,則 有環(huán)疯溺;

使用graphx 實(shí)現(xiàn)

graphx 一般只能實(shí)現(xiàn)基于消息機(jī)制的 bfs 算法
在我們的實(shí)現(xiàn)中论颅,為每個(gè) node哎垦,記錄 路徑, 然后看下一個(gè)節(jié)點(diǎn)恃疯,是否包含在路徑中漏设,如果包含則有圖;

每個(gè)節(jié)點(diǎn)今妄,需要保存路徑郑口,內(nèi)存開(kāi)銷(xiāo)很大鸳碧,目前還沒(méi)有找到好的算法實(shí)現(xiàn);
參考犬性,scala 版本
https://codeleading.com/article/35132638895/

java 版本:

        public static void main(String[] args) {

        SparkConf conf = new SparkConf().setAppName("Graphx Learning");
        conf.setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);

        ClassTag<Long> LongTag = scala.reflect.ClassTag$.MODULE$.apply(Long.class);
        ClassTag<List<Long>> ListLongTag = scala.reflect.ClassTag$.MODULE$.apply(List.class);

            ClassTag<HashMap<Object,Long>> mapTag = scala.reflect.ClassTag$.MODULE$.apply(Map.class);

        List<String> edges = Lists.newArrayList(
     "1 2",
                "2 3",
                "3 4",
                "4 5",
                "5 1",
                "5 3",
                "6 7",
                "7 6",
                "7 8",
                "8 7",
                "1 9",
                "9 1"
        );


        JavaRDD<Edge<Long>> rddEdges = sc.parallelize(edges).map(x->
                 new Edge(Long.parseLong(x.split(" ")[0]),
                         Long.parseLong(x.split(" ")[1]),1L));

        Graph<List<Long>,Long> graph = Graph.fromEdges(rddEdges.rdd(),new ArrayList<>(),
                StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(),ListLongTag,LongTag);

        Object obj = reflexivity();
        Predef.$eq$colon$eq<List<Long>,List<Long>> tpEqus = ( Predef.$eq$colon$eq<List<Long>,List<Long>>) obj;
        Graph<List<Long>, Long> ready = graph.mapVertices(new SimpleInitGraph(),ListLongTag,tpEqus);

        Graph<List<Long>,Long> LPA = ready.ops().pregel(new ArrayList<>(),
                10, EdgeDirection.Either(),
                new VProj(), new SendMsg(), new ReduceMsg(),ListLongTag );
        LPA.vertices().toJavaRDD()
               // .filter(x->x._2.get(0).equals(x._2.get(x._2.size()-1)))
                .foreach(x->{
            System.out.println(x._1+"\t"+x._2);
        });
    }


    static public <T> Predef.$eq$colon$eq<T, T> reflexivity() {
        return Predef.$eq$colon$eq$.MODULE$.tpEquals();
    }


    static class SimpleInitGraph extends AbstractFunction2<Object,List<Long>,List<Long>> implements Serializable {

        @Override
        public List<Long> apply(Object v1, List<Long> v2) {
            return new ArrayList<>();
        }
    }

    static class VProj extends AbstractFunction3<Object,List<Long>,List<Long>,List<Long>> implements Serializable {


        @Override
        public List<Long> apply(Object v1, List<Long> v2, List<Long> v3) {
            List<Long> res = new ArrayList<>();
            res.addAll(v3);
            return res;
        }
    }

    static class SendMsg extends AbstractFunction1<EdgeTriplet<List<Long>,Long>, Iterator<Tuple2<Object,List<Long>>>>
            implements Serializable{

        @Override
        public Iterator<Tuple2<Object, List<Long>>> apply(EdgeTriplet<List<Long>, Long> v1) {
            List<Tuple2<Object,List<Long>>> res = new ArrayList<>();
            if(v1.srcAttr().size() == 0){
                Object id = v1.dstId();
                List<Long> src_des = Lists.newArrayList(v1.srcId(),v1.dstId());
                Tuple2<Object,List<Long>> path = new Tuple2<>(id, src_des);
                res.add(path);
                return JavaConverters.asScalaIteratorConverter(res.iterator()).asScala();
            }else{
                Long desId = v1.dstId();
                List<Long> oldPath = v1.srcAttr();

                for(int i=1;i<oldPath.size();i++) {
                    if (oldPath.get(i).equals(desId)) {
                        //find a circle, don't repeat
                        System.out.println("find a circle " + oldPath + "\t" + desId );
                        return JavaConverters.asScalaIteratorConverter(res.iterator()).asScala();
                    }
                }
                Object id = v1.dstId();
                List<Long> src_des = new ArrayList<>();
                src_des.addAll(oldPath);
                src_des.add(desId);
                Tuple2<Object,List<Long>> path = new Tuple2<>(id, src_des);
                res.add(path);
                return JavaConverters.asScalaIteratorConverter(res.iterator()).asScala();

            }

        }
    }

    static class ReduceMsg extends AbstractFunction2<List<Long>,List<Long>,List<Long>>
                            implements Serializable {

        @Override
        public List<Long> apply(List<Long> v1, List<Long> v2) {
            return v1;
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞻离,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乒裆,更是在濱河造成了極大的恐慌套利,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹤耍,死亡現(xiàn)場(chǎng)離奇詭異肉迫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)稿黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)喊衫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人杆怕,你說(shuō)我怎么就攤上這事族购。” “怎么了陵珍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵联四,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撑教,道長(zhǎng)朝墩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任伟姐,我火速辦了婚禮收苏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愤兵。我一直安慰自己鹿霸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布秆乳。 她就那樣靜靜地躺著懦鼠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屹堰。 梳的紋絲不亂的頭發(fā)上肛冶,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音扯键,去河邊找鬼睦袖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荣刑,可吹牛的內(nèi)容都是我干的馅笙。 我是一名探鬼主播伦乔,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼董习!你這毒婦竟也來(lái)了烈和?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤皿淋,失蹤者是張志新(化名)和其女友劉穎斥杜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沥匈,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔗喂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了高帖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缰儿。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖散址,靈堂內(nèi)的尸體忽然破棺而出乖阵,到底是詐尸還是另有隱情,我是刑警寧澤预麸,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布瞪浸,位于F島的核電站,受9級(jí)特大地震影響吏祸,放射性物質(zhì)發(fā)生泄漏对蒲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一贡翘、第九天 我趴在偏房一處隱蔽的房頂上張望蹈矮。 院中可真熱鬧,春花似錦鸣驱、人聲如沸泛鸟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)北滥。三九已至,卻和暖如春闸翅,著一層夾襖步出監(jiān)牢的瞬間再芋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工缎脾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祝闻,地道東北人占卧。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓遗菠,卻偏偏與公主長(zhǎng)得像联喘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辙纬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容