Streaming黑名單過濾(transform算子的使用)

原始數據:

20180808,zs
20180808,ls
20180808,ww

黑名單列表:

zs
ls

思路:
1、原始日誌可以通過Streaming直接讀取成一個DStream
2、名單通過RDD來模擬一份

邏輯實現:
1、將DStream轉成(黑名單隻有名字)

(zs,(20180808,zs))(ls,(20180808,ls))(ww,( 20180808,ww))

2、然後將黑名單轉成

(zs, true)(ls, true)

3、然後DStram與RDD進行LeftJoin(DStream能與RDD進行Join就是借用的transform算子)

具體代碼實現及註釋:

package com.soul.spark.Streaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * @author soulChun
  * @create 2019-01-10-16:12
  *        黑名單過濾
  */
object TransformApp {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("StatafulFunApp").setMaster("local[2]")
    val ssc = new StreamingContext(sparkConf,Seconds(10))
    //構建黑名單
    val blacks = List("zs", "ls")
    //通過map操作將黑名單結構轉換成(zs, true)(ls, true)
    val blackRDD = ssc.sparkContext.parallelize(blacks).map(x => (x, true))

    val lines = ssc.socketTextStream("localhost", 8769)
    //lines (20180808,zs)
    //lines 通過map.split(1)之後取得就是zs,然後加一個x就轉成了(zs,(20180808,zs)).就可以和blackRDD進行Join了
    val clicklog = lines.map(x => (x.split(",")(1), x)).transform(rdd => {
      //Join之後數據結構就變成了(zs,[(20180808,zs),true]),過濾掉第二個元素中的第二個元素等於true的
      rdd.leftOuterJoin(blackRDD).filter(x => x._2._2.getOrElse(false) != true)
        //我們最後要輸出的格式是(20180808,zs),所以取Join之後的第二個元素中的第一個元素
        .map(x => x._2._1)
    })

    ssc.start()
    ssc.awaitTermination()
  }

}

最後只會輸出:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章