【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");
    }
}

分析结果


相关推荐
keyanbanyungong1 小时前
被市场忽略的AI4S细分赛道:MedPeer生物医药科研数字化稀缺龙头
大数据·人工智能
北京软秦科技有限公司1 小时前
跨区域批量项目交付难题如何破解?IACheck AI报告审核通审Agent版推动检测机构实现报告均质化管理
大数据·人工智能
鉴生Eric2 小时前
改造预算有限怎么办?先车库、走廊等高耗电区域分步升级照明
大数据·人工智能
AllData公司负责人2 小时前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析
Databend2 小时前
小 Bitmap,大优化:Databend 如何加速大规模集合聚合
大数据·数据库·sql
本旺2 小时前
Flink 2.x状态演进:理解解 1.x 与 2.x 状态存储机制
大数据·flink
格子生意经3 小时前
GEO系统多引擎自适应算法实战解析
大数据·人工智能
2601_957190903 小时前
2026 沉浸式文旅投资风口|XR 黑暗乘骑市场前景、收益模型与落地指南
大数据·娱乐
Apache Flink3 小时前
从结构化到多模态:Apache Flink,多模态数据处理的流式底座
大数据·flink·apache
阿乔外贸日记3 小时前
快速了解东帝汶市场 基础经济概况汇总
大数据·人工智能