原始數據:
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()
}
}
最後只會輸出: