transform以及实时黑名单过滤案例实战

用spark streaming实现黑名单实时过滤 项目介绍: 本项目用spark streaming实现简单的黑名单实时过滤,用scala语言编写,用到的知识点如下: 1.RDD,弹性分布式数据集 2.ssc.socketTextStream("localhost",9999),利用socketTextStream接口编程,监控端口数据 3.leftOuterJoin 4.transform函数使用 5.  nc -lkv 9999 阅读详情
package com.bynear.spark_Streaming;

import com.google.common.base.Optional;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import scala.Tuple2;

import java.util.ArrayList;
import java.util.List;

/**
 * 2018/5/15
 * 9:57
 * transform以及实时黑名单过滤案例实战
 */
public class Transform {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("transtrom").setMaster("local[2]");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        JavaStreamingContext jssc = new JavaStreamingContext(jsc, Durations.seconds(5));
        /**用户针对我们的网站上的广告可以进行点击,
         * 点击之后,是不是要进行实时计费,点一次,算一次钱
         * 但是,对于那些帮助某些无良商家,刷广告的人,那么我们有一个黑名单,只要是黑名单重点 用户点击了广告,
         * 我们给过滤点
         * 这里的日志格式就简化一下!  就是date username的方式
         */
        JavaReceiverInputDStream<String> adsClickLogDStream = jssc.socketTextStream("localhost", 9999);
        /**所有要先对输入的数据,进行一下转换操作,变成(username,date username)
         * 以便于,后面对每个batch的RDD,与定义好的黑名单进行join操作
         */
//        黑名单RDD
        List<Tuple2<String, Boolean>> blacklistData = new ArrayList<Tuple2<String, Boolean>>();
        blacklistData.add(new Tuple2<String, Boolean>("tom", true));
        final JavaPairRDD<String, Boolean> blcakListRDD = jsc.parallelizePairs(blacklistData);

        JavaPairDStream<String, String> userAdsClickLogDStream = adsClickLogDStream.mapToPair(new PairFunction<String, String, String>() {
            @Override
            public Tuple2<String, String> call(String log) throws Exception {
                String[] LogSplit = log.split(" ");
//                返回值为  username, date username
                return new Tuple2<String, String>(LogSplit[1], log);
            }
        });

        /**之后,就可以执行transform操作,将每个batch的RDD,与黑名单RDD进行join,filter,map等操作
         * 实时进行黑名单过滤
         */
        JavaDStream<String> validAdsClickLogDStream = userAdsClickLogDStream.transform(
                new Function<JavaPairRDD<String, String>, JavaRDD<String>>() {
                    @Override
//                    参数说明(javaPairRDD(username,date username)userAdsClickLogRDD 为输入的每一个batch对应的RDD )
                    public JavaRDD<String> call(JavaPairRDD<String, String> userAdsClickLogRDD) throws Exception {
//                        blackListRDD(Tuple(username,true))与JavaPairRDD(username,date username)
//                        左外join,返回值为javaPairRDD(username,Tuple2(date username ,true/false))
                        JavaPairRDD<String, Tuple2<String, Optional<Boolean>>> joinRDD = userAdsClickLogRDD.leftOuterJoin(blcakListRDD);
//                       filter过滤参数说明 javaPairRDD(username,Tuple2(date username ,true/false))
                        JavaPairRDD<String, Tuple2<String, Optional<Boolean>>> filterJoinRDD = joinRDD.filter(new Function<Tuple2<String, Tuple2<String, Optional<Boolean>>>, Boolean>() {
                            @Override
//                            进行filter过滤,返回值为 true/false
//                            参数Tuple2(username,Tuple2(date username,true/false))
                            public Boolean call(Tuple2<String, Tuple2<String, Optional<Boolean>>> tuple) throws Exception {
//                                如果Tuple2中的Tuple2中的第二个参数(true/false)存在,并且值为true,返回false 直接过滤,否则保留
                                if (tuple._2._2.isPresent() && tuple._2._2.get()) {
                                    return false;
                                }
                                return true;
                            }
                        });
//                        参数Tuple2(username,Tuple2(date usrname,true/false))
                        JavaRDD<String> validClickLogRDD = filterJoinRDD.map(new Function<Tuple2<String, Tuple2<String, Optional<Boolean>>>, String>() {
                            @Override
                            public String call(Tuple2<String, Tuple2<String, Optional<Boolean>>> tuple) throws Exception {
//                              返回值为 date username
//                                20180515105760 apple     apple
//                                return tuple._2._1 + "     " + tuple._1;
                                return tuple._2._1;
                            }
                        });


                        return validClickLogRDD;
                    }
                });

        validAdsClickLogDStream.print();

        jssc.start();
        jssc.awaitTermination();
        jssc.stop();


    }
}

说明:生成的jar 运行在了集群上!
结果:
nc -lk 9999 窗口输入的数据
20180515105756 zjs
20180515105757 lt
20180515105758 black
20180515105759 orang
20180515105760 apple
20180515105761 huawei
20180515105762 xiaomi
20180515105763 tom
运行程序的窗口产生的数据
20180515105757 lt
20180515105760 apple
20180515105756 zjs
20180515105761 huawei
20180515105759 orang
20180515105758 black
20180515105762 xiaomi

其中username为“Tom”的被黑名单拦截了!

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go) 华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】 阅读详情

相关推荐

【机器人】机械臂控制入门技术栈分享

机械臂控制入门技术栈分享1.前言2.机器人控制入门技术栈2.1.空间描述和变化2.2.运动学分析2.3.动力学建模2.4.控制入门学习3.进阶部分3.1.机器人参数辨识3.2.非线性控制3.3.现代机器人描述方法:指数坐标4.总结 1.前言 今天看到优快云上有个分享个人技术栈的活动,虽然我不是一个正规的程序员,也不搞前端、后端这些,但我一直在优快云上通过写博客对我的学习进行总结,于是我突发奇想,不如我也写一下我的个人技术栈,针对机械臂控制入门的,因为我水平也不高,所以本文内容也许不够饱满,也不够准确,但

要恰饭得嘛 5859

XSLT转换xml文件的案例

XML文件: 1 ABC ABC ABC dfafadssfas dfafadssfas EFG dfafadssfas dfafadssfas dfafadssfas 1 ABC ABC

新手记录工作中成长点滴- 2843

Anomalies,Factors,andMultiFactorModels

转 Anomalies, Factors, and Multi-Factor Models 作者:石川,量信投资创始合伙人,清华大学学士、硕士,麻省理工学院博士;精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化。知乎专栏:https://zhuanlan.zhihu.com/mitcshi。未经授权,严禁转载。 摘要:本文解释了异象、因子以及多因子模型的区别和联系;梳理了从异象到因子再...

绿杨 794

XSLT的转换机制

工厂类:由抽象类javax.xml.transform.TransformerFactory.newInstance()获取实现工厂类 该工厂方法的搜索路径顺序如下: 1. 检查java系统属性值“javax.xml.transform.TransformerFactory” 2. 查询jar文件中的/META-INF/services/javax.xml.transform.Transfo

Jeffrey's 专栏 1311

前沿数据解析 | 麻省理工-斯坦福-丰田研究中心电池数据集:AI驱动下的电池寿命早期预测

本文解析了麻省理工、斯坦福与丰田研究中心联合发布的电池数据集,展示了AI驱动下的电池寿命早期预测技术。通过分析124个商用锂离子电池的完整生命周期数据,研究团队仅用前100次循环数据即可准确预测电池报废时间,为电动汽车电池管理提供革命性解决方案。数据集包含LFP/石墨体系电池的详细测试记录,结合差分容量分析和梯度提升树模型,预测精度显著提升。

weixin_26950847的博客 530

Antlr4入门(二)基本概念解析

在上一章中(Antlr4入门(一)IDEA中Antlr的安装与使用),我们安装了Antlr,并编写运行了第一个程序“Hello world”。而在本章中,我们将学习语言类应用程序相关的重要过程、术语和数据结构。 一. 术语 语言(language)是由一系列有意义的语句组成,语句(sentence)由词组组成,词组(phrase)是由更小的子词组(subphrase)和词汇符号(vocabulary symbols)组成。 举个例子,英语就是一种语言,“Keep on going never gi.

qq_37771475的博客 5209

利用XSLT转换XML学习笔记

import javax.xml.transform.Source;import javax.xml.transform.Templates;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stream.StreamSour

卧龙的专栏 1437

Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼

本文深入解析Ubuntu 22.04蓝牙开关秒关问题,指出Intel固件文件缺失是常见原因,并提供详细修复方案。通过确认硬件型号、检查固件文件及智能替代方案,帮助用户快速解决蓝牙故障,提升系统稳定性。

weixin_30247307的博客 758

Transformations on DStreams之transform的使用 实现黑名单操作/指定过滤

Transformations on DStreams之transform 实现黑名单操作/指定过滤 官网:http://spark.apache.org/docs/latest/streaming-programming-guide.html#transformations-on-dstreams transform(func) Return a new DStream by applying...

qq_43688472的博客 557

Vitis Model Composer闪退?手把手教你用命令行启动Vivado 2021后的System Generator

本文详细解析了Vitis Model Composer闪退问题的根本原因,并提供了命令行启动Vivado 2021后System Generator的完整解决方案。从环境变量配置、组件缺失排查到权限问题处理,手把手教你通过命令行深度排错,并分享高级自动化脚本和系统优化技巧,帮助开发者高效使用Vitis Model Composer与System Generator进行HDL开发。

weixin_26905487的博客 349

华为OD机考双机位C卷 - 两个字符串间的最短路径(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 两个字符串间的最短路径(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 835

JAVA安全(偏基础)

java基本的安全知识,后续会持续更新JAVA方面安全知识

weixin_65049289的博客 1693

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

Spark Streaming-transform以及广告计费日志实时黑名单过滤案例实战

transform操作应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,在DStream API中,并没有提供将一个DStream中的每个batch与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.join(),只能join其他DStream。在DS...

上海一九四三 542

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

91、Spark Streaming之transform以及广告计费日志实时黑名单过滤案例实战

transform以及实时黑名单过滤案例实战 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.j...

ZJ__ZFH的博客 1483

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

56、Spark Streaming: transform以及实时黑名单过滤案例实战

一、transform以及实时黑名单过滤案例实战 1、概述 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中, 并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作...

weixin_30830327的博客 182

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

12.transform以及实时黑名单过滤案例实战

transform以及实时黑名单过滤案例实战 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.

认知 行动 坚持 1764

Spark-Streaming之transform操作,实时黑名单过滤案例

Transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.join(),只能join其他DStream。在

ZMC921的博客 1175

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、然后将...

UniqueChunBlog 884

Spark Streaming之Transform算子详解

Transform算子解读: transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现, DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个 batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.join(),只能join其他DStream。在DStream每个batch的RDD计算出来之后,会去跟其他 DStream的R

蔡政洁的博客 2245

sparkStreaming之transform的细节

val socketLineDStream: ReceiverInputDStream[String] = streamingContext.socketTextStream('linux1', 8888) // TODO Driver中执行一次 // 例如val a = 1 在Driver中只执行一次 // 首先看一下DStream的其他Transformations(转换)操作 socketLineDStream.map({ case x => { // TODO Exec

weixin_42307036的博客 4191

Spark之SparkStreaming案例-transform

Transform 操作transform操作允许将任意RDD到RDD函数应用于DStream。 它可用于应用任何未在DStream API中公开的RDD操作。 例如,将数据流中的每个批处理与其他数据集相结合的功能不会直接暴露在DStream API中。 但是,您可以轻松地使用transform来执行此操作。 这使得非常强大的可能性。 例如,可以通过将输入数据流与预先计算的垃圾信息(也可以用Spar

chbxw 9439

Spark Streaming transform以及广告计费日志实时黑名单过滤+window滑动窗口以及热点搜索词滑动统计...

一.transform以及广告计费日志实时黑名单过滤案例实战 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 D...

Transkai 149

spark streaming中transform过滤广告黑名单

  /* transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中 所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join 的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.join(),只能join其他D...

lv_yishi的博客 537

spark streaming -过滤黑名单

通过spark streaming实时统计过滤黑名单,稍微改动一下,可以结合到真实企业案例中import java.util.ArrayList; import java.util.List; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spa...

贾红平 1022

SparkStreaming transform算子入门案例

概念解析 参数为函数,且函数的形参是个rdd类型,返回值为Dstream类型 def transform[U : ClassTag](transformFunc: RDD[T] => RDD[U]): DStream[U] Return a new DStream in which each RDD is generated by applying a function on each RDD of ‘this’ DStream. 案例 以nc作为测试源 nc -lk mypc01 10087

鸭梨的博客 340
上一篇: left join 和 left outer join 的区别
下一篇: sql基本命令整理
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值