【Flink实战】新老用户分析:按照操作系统维度进行新老用户的分析

🚀 作者 :"大数据小禅"

🚀 文章简介 :新老用户分析:按照操作系统维度进行新老用户的分析

🚀 欢迎小伙伴们 点赞 👍、收藏 ⭐、留言💬


目录导航

同类产品参考

日志的数据格式

java 复制代码
{
"deviceType":"iPhone 10",
"uid":"user_1",
"product":{
"name":"宝马",
"category":"车"
},
"os":"iOS",
"ip":"171.11.85.21",
"nu":1,
"channel":"华为商城",
"time":1735419335423,
"event":"browse",
"net":"WiFi",
"device":"4759947c-cd47-433c-ac8f-ae923a6d38b6",
"version":"V1.2.0"
}

需求:按照操作系统维度进行新老用户的分析

java 复制代码
    <dependency>
        <groupId>org.apache.bahir</groupId>
        <artifactId>flink-connector-redis_2.11</artifactId>
        <version>1.0</version>
    </dependency>
  • 代码
java 复制代码
public class OsUserCntAppV1 {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> stream = environment.readTextFile("data/access.json");
        environment.setParallelism(1); //设置并行度为1方便观察
        SingleOutputStreamOperator<Access> filter = stream.map(new MapFunction<String, Access>() {
            @Override
            public Access map(String s) throws Exception {
                // json 转 Access
                try {
                    return JSON.parseObject(s, Access.class);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
            //这里是只要不为空的数据  x != null等于把上面的空的数据过滤掉
        }).filter(x -> x != null).filter(new FilterFunction<Access>() {
            @Override
            public boolean filter(Access access) throws Exception {
                //只过滤出来 event='startup'的数据
                return "startup".equals(access.event);
            }
        });
        //Access{device='6d27244c-b5e5-4520-9c6d-c4e17e2391fe', deviceType='iPhone 9', os='iOS', event='startup', net='4G', channel='华为商城', uid='user_36', nu=0, nu2=0, ip='123.232.241.201', time=1735419335573, version='V1.2.0', province='null', city='null', product=null}
        // 操作系统维度  新老用户
        //返回三元组 (操作系统 新老用户 数字1)
        SingleOutputStreamOperator<Tuple3<String, Integer, Integer>> sum = filter.map(new MapFunction<Access, Tuple3<String, Integer, Integer>>() {
            @Override
            public Tuple3<String, Integer, Integer> map(Access access) throws Exception {
                return Tuple3.of(access.os, access.nu, 1);
            }
            //根据OS操作系统 与 字段nu新老用户分组  传入三元组返回二元组  
            //因为是按照Tuple2<String, Integer>这两个进行keyby 所以进入三元组出去二元组
        }).keyBy(new KeySelector<Tuple3<String, Integer, Integer>, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> getKey(Tuple3<String, Integer, Integer> value) throws Exception {
                return Tuple2.of(value.f0, value.f1);
            }
            /**
             * (Android,1,1)
             * (iOS,1,1)
             * (iOS,0,1)
             */
            //根据第三个字段进行聚合
        }).sum(2);
        //结果
        /**
         * (Android,1,23)
         * (Android,0,13)
         * (iOS,0,20)
         */

        //单机redis  出现连接超时->修改redis.conf配置文件 bing IP
        FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("192.168.192.100").build();

        sum.addSink(new RedisSink<>(conf,new RedisSinkForV1()));
        environment.execute("OsUserCntAppV1");
    }
}

分析结果


相关推荐
奥顺互联V2 小时前
深入理解 ThinkPHP:框架结构与核心概念详解
大数据·mysql·开源·php
郭源潮3452 小时前
Hadoop
大数据·hadoop·分布式
中科岩创2 小时前
中科岩创桥梁自动化监测解决方案
大数据·网络·物联网
百家方案3 小时前
「下载」智慧产业园区-数字孪生建设解决方案:重构产业全景图,打造虚实结合的园区数字化底座
大数据·人工智能·智慧园区·数智化园区
forestsea3 小时前
【Elasticsearch】分片与副本机制:优化数据存储与查询性能
大数据·elasticsearch·搜索引擎
开着拖拉机回家3 小时前
【Ambari】使用 Knox 进行 LDAP 身份认证
大数据·hadoop·gateway·ambari·ldap·knox
地球资源数据云3 小时前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
INFINI Labs4 小时前
Elasticsearch filter context 的使用原理
大数据·elasticsearch·jenkins·filter·querycache
Ahern_4 小时前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
李昊哲小课4 小时前
deepin 安装 kafka
大数据·分布式·zookeeper·数据分析·kafka