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

分析结果


相关推荐
大大大大晴天11 小时前
每天认识一个组件:数据治理Apache Atlas
大数据
数字新视界11 小时前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
姜穆澜13 小时前
OneID 从 0 到 1 完整生产案例(四)
大数据
OsDepK14 小时前
项目快速Git至仓库(完整版)
大数据·git·elasticsearch·搜索引擎
合米AI SOP系统14 小时前
传统产线如何快速上马落地 AI 防错?合米科技 AI SOP 7天即可上线。
大数据·人工智能·科技
思录Echo14 小时前
什么决定具身智能的最终走向?多技术路线与落地现实辨析
大数据·人工智能
xiaohaiAIgeo15 小时前
【2026年】AI监控加行为分析守护实验室安全
大数据·人工智能·科普知识
林墨聊AIGC15 小时前
动漫AI视频创作工具在哪找到的?2026年最新动漫AI视频平台与软件指南
大数据·人工智能·ai作画·aigc·音视频
故七月16 小时前
告别 AI 时代品牌 “隐身”:万域智瞰 AI‑GEO,构建品牌大模型时代营销新基建
大数据·人工智能
数字孪生视频孪生18 小时前
三维实时重构异构底座 核工危化无感定位跨境轨迹一屏统揽
大数据·运维·人工智能·重构·架构