国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV

這篇具有很好參考價值的文章主要介紹了基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

水善利萬物而不爭,處眾人之所惡,故幾于道??

一、 網(wǎng)站總流量數(shù)統(tǒng)計 - PV

? 1. 需求分析

? 2. 代碼實現(xiàn)

?? 方式一

?? 方式二

?? 方式三:使用process算子實現(xiàn)

?? 方式四:使用process算子實現(xiàn)

二、網(wǎng)站獨立訪客數(shù)統(tǒng)計 - UV

? 1. 需求分析

? 2. 代碼實現(xiàn)


一、 網(wǎng)站總流量數(shù)統(tǒng)計 - PV

??PV全稱 Page View,也就是一個網(wǎng)站的頁面瀏覽量。每當(dāng)用戶進(jìn)入網(wǎng)站加載或者刷新某個頁面時,就會給該網(wǎng)站帶來PV量,它往往用來衡量一個網(wǎng)站的流量和用戶活躍度。當(dāng)然了,單個指標(biāo)并不能全面的反映網(wǎng)站的實際情況,往往需要結(jié)合其他的指標(biāo)進(jìn)行分析。

1. 需求分析
??埋點采集到的數(shù)據(jù)格式大概是這個樣子(文件已上傳資源)

基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)第一個是userId、第二個是itemId、第三個是categoryId、第四個是behavior、第五個是timestamp

所以我們要統(tǒng)計PV的話要先從第四列中篩選出PV,然后再進(jìn)行累加,求出最終的PV

2. 代碼實現(xiàn)
方式一:
??先用 readTextFile()讀取文件,然后將讀取到的每行數(shù)據(jù)封裝成一個bean對象,再通過 filter過濾出我們需要的PV數(shù)據(jù),這時得到的都是封裝好的一個個對象沒法直接sum,所以通過 map將數(shù)據(jù)映射為一個個的元組類型(PV,1)然后,使用 keyBy()將他們分到同一個并行度中進(jìn)行 sum,得出最終的結(jié)果。
public class Flink01_Project_PV {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port",1000);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
        env.setParallelism(2);

        env
                .readTextFile("input/UserBehavior.csv")
                // 將數(shù)據(jù)封裝成 UserBehavior 對象
                .map(new MapFunction<String, UserBehavior>() {
                    @Override
                    public UserBehavior map(String line) throws Exception {
                        String[] data = line.split(",");
                        return new UserBehavior(
                                Long.valueOf(data[0]),
                                Long.valueOf(data[1]),
                                Integer.valueOf(data[2]),
                                data[3],
                                Long.valueOf(data[4]));
                    }
                })
                // 過濾出行為為PV的數(shù)據(jù)
                .filter(new FilterFunction<UserBehavior>() {
                    @Override
                    public boolean filter(UserBehavior value) throws Exception {
                        return "pv".equals(value.getBehavior());
                    }
                })
                // 因為直接求和的話沒法求,所以做一次映射,映射成 (PV,1) 這樣的結(jié)構(gòu)
                .map(new MapFunction<UserBehavior, Tuple2<String,Long>>() {
                    @Override
                    public Tuple2<String, Long> map(UserBehavior value) throws Exception {
                        return Tuple2.of(value.getBehavior(),1L);
                    }
                })
                // 然后 將他們通過key進(jìn)行分組,進(jìn)入同一個并行度里面 進(jìn)行求和
                .keyBy(new KeySelector<Tuple2<String, Long>, String>() {
                    @Override
                    public String getKey(Tuple2<String, Long> value) throws Exception {
                        return value.f0;
                    }
                })
                // 進(jìn)行求和
                .sum(1)
                .print();

        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:
基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)

方式二:

??這種方式省去了方式一的封裝對象,其他的思路都一樣。

public class Flink01_Project_PV {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port",1000);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
        env.setParallelism(2);

        env
                .readTextFile("input/UserBehavior.csv")
                // 直接過濾出我們想要的數(shù)據(jù)
                .filter(new FilterFunction<String>() {
                    @Override
                    public boolean filter(String value) throws Exception {
                        String[] data = value.split(",");
                        return "pv".equals(data[3]);
                    }
                })
                // 然后將結(jié)構(gòu)轉(zhuǎn)換為元組類型 (PV,1)
                .map(new MapFunction<String, Tuple2<String,Long>>() {
                    @Override
                    public Tuple2<String, Long> map(String value) throws Exception {
                        String[] data = value.split(",");
                        return Tuple2.of(data[3],1L);
                    }
                })
                // 通過key分組
                .keyBy(new KeySelector<Tuple2<String, Long>, String>() {
                    @Override
                    public String getKey(Tuple2<String, Long> value) throws Exception {
                        return value.f0;
                    }
                })
                // 求和
                .sum(1)
                .print();

        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:
基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)

方式三:使用process算子實現(xiàn)

??首先使用readTextFile讀取數(shù)據(jù),使用map將讀取到的數(shù)據(jù)封裝為對象,然后使用keyBy進(jìn)行分組,最后使用process算子進(jìn)行求解

  • 為什么要使用keyBy():目的是讓pv數(shù)據(jù)進(jìn)入同一個并行度,如果不使用直接process的話,兩個并行度里面都有一個sum,結(jié)果就不對了
  • 為什么不使用filter過濾呢?因為我們的過濾邏輯是再process里面完成的,所以不用再額外過濾
public class Flink02_Project_PV_process {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port",1000);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
        env.setParallelism(2);

        env
                .readTextFile("input/UserBehavior.csv")
                // 封裝成 UserBehavior 對象
                .map(new MapFunction<String, UserBehavior>() {
                    @Override
                    public UserBehavior map(String line) throws Exception {
                        String[] data = line.split(",");
                        return new UserBehavior(
                                Long.valueOf(data[0]),
                                Long.valueOf(data[1]),
                                Integer.valueOf(data[2]),
                                data[3],
                                Long.valueOf(data[4]));
                    }
                })
                // 通過key分組
                .keyBy(new KeySelector<UserBehavior, String>() {
                    @Override
                    public String getKey(UserBehavior value) throws Exception {
                        return value.getBehavior();
                    }
                })
                // 使用proces算子實現(xiàn) PV 的統(tǒng)計
                .process(new ProcessFunction<UserBehavior, String>() {
                    // 定義累加變量
                    long sum =0L ;
                    @Override
                    public void processElement(UserBehavior value, Context ctx, Collector<String> out) throws Exception {
                        // 判斷用戶行為是否是PV
                        if ("pv".equals(value.getBehavior())){
                            // 條件滿足 sum+1
                            sum++;
                            // 將結(jié)果收集
                            out.collect("pv = "+sum);
                        }
                    }
                })
                .print();

        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:
基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)

方式四:使用process算子實現(xiàn)

??方式四相比于方式三省去了對象的封裝,其他思路一樣。

public class Flink02_Project_PV_process {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port",1000);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
        env.setParallelism(2);

        env
                .readTextFile("input/UserBehavior.csv")
                // 通過key分組
                .keyBy(new KeySelector<String, String>() {
                    @Override
                    public String getKey(String value) throws Exception {
                        return value.split(",")[3];
                    }
                })
                // 直接使用process求 PV
                .process(new ProcessFunction<String, String>() {
                    // 定義累加變量
                    long sum = 0L;
                    @Override
                    public void processElement(String line, Context ctx, Collector<String> out) throws Exception {
                    	// 將過來的每行數(shù)據(jù)切割
                        String[] datas = line.split(",");
                        // 判斷是否是我們想要的數(shù)據(jù)
                        if("pv".equals(datas[3])){
                        	// 符合條件,將累加變量+1
                            sum++;
                            // 收集結(jié)果
                            out.collect("pv = "+sum);
                        }
                    }
                })
                .print();

        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:
基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)


二、網(wǎng)站獨立訪客數(shù)統(tǒng)計 - UV

??UV全稱 Unique Visitor,也就是獨立訪客數(shù)。在PV中,我們統(tǒng)計的是所有用戶對所有頁面的瀏覽行為,也就是同一個用戶的瀏覽行為會被重復(fù)統(tǒng)計。實際上我們關(guān)注的是在某一特定范圍內(nèi)(一天、一周或者一個月)內(nèi)訪問該網(wǎng)站的用戶數(shù),也就是每個訪客只計算一次。它能從側(cè)面反映出該網(wǎng)站的受歡迎程度和用戶規(guī)模的大小。

1. 需求分析
??要統(tǒng)計UV量的話,只需要對全量的PV,使用userId去重,然后就能得到獨立訪客數(shù)了。
2. 代碼實現(xiàn)

??先filter過濾出PV數(shù)據(jù),然后通過keyBy將PV分到同一組,然后使用process進(jìn)行處理,處理方法是:用set集合存放userId,如果下一個userId可以加入該集合說明是一個新的獨立訪客,則收集當(dāng)前集合的大小,若加入失敗,說明集合中已經(jīng)存在該userId,也就是不是一個新的獨立訪客,也就不做處理了。

public class Flink03_Project_UV {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port",1000);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(conf);
        env.setParallelism(2);

        env
                .readTextFile("input/UserBehavior.csv")
                // 過濾出 PV 數(shù)據(jù)
                .filter(new FilterFunction<String>() {
                    @Override
                    public boolean filter(String value) throws Exception {
                        return "pv".equals(value.split(",")[3]);
                    }
                })
                // 將PV的數(shù)據(jù)分到同一個組里面
                .keyBy(new KeySelector<String, String>() {
                    @Override
                    public String getKey(String value) throws Exception {
                        return value.split(",")[3];
                    }
                })
                // 對同一組里面的數(shù)據(jù)進(jìn)行處理
                .process(new ProcessFunction<String, String>() {
                    // 存放 userId 的容器,回自動對數(shù)據(jù)進(jìn)行去重,最后直接拿它的大小就知道UV了
                    Set<Long> userIdSet = new HashSet<>();
                    @Override
                    public void processElement(String value, Context ctx, Collector<String> out) throws Exception {
                        Long userId = Long.valueOf(value.split(",")[0]);
                        // 向set中添加userId,判斷是否添加成功
                        if (userIdSet.add(userId)) {
                            // 添加成功的話,說明是一個新的獨立訪客,收集到此時容器大小
                            out.collect("UV = "+ userIdSet.size());
                        }
                    }
                })
                .print();

        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:
基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV,Flink,Flink統(tǒng)計PV、UV,大數(shù)據(jù)編程練習(xí),Flink流處理編程實戰(zhàn),Flink算子練習(xí),Flink - Java,網(wǎng)站流量統(tǒng)計,Flink基礎(chǔ)練習(xí)文章來源地址http://www.zghlxwxcb.cn/news/detail-623517.html

到了這里,關(guān)于基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 微信小程序UV、PV量解釋以及接口調(diào)用頻率

    微信小程序UV、PV量解釋以及接口調(diào)用頻率

    微信小程序UV、PV量 瀏覽量(PV): 即通常說的Page View(PV),用戶每打開一個網(wǎng)站頁面就被記錄1次。用戶多次打開同一頁面,瀏覽量值累計。 微信小程序中PV是打開小程序的打開次數(shù)。 訪客數(shù)(UV): 一天之內(nèi)網(wǎng)站的獨立訪客數(shù)(以Cookie為依據(jù)),一天內(nèi)同一訪客多次訪問網(wǎng)站只計算

    2024年02月16日
    瀏覽(21)
  • QPS TPS RPS PV UV 等名詞解釋

    QPS :即Queries Per Second的縮寫,每秒能處理查詢數(shù)目。是 一臺 服務(wù)器每秒能夠相應(yīng)的查詢次數(shù),是對一個 特定的查詢服務(wù)器 在規(guī)定時間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。 每秒鐘處理完請求的次數(shù);注意這里是處理完,具體是指發(fā)出請求到服務(wù)器處理完成功返回結(jié)果。可以理解

    2024年02月10日
    瀏覽(19)
  • 2023-06-13:統(tǒng)計高并發(fā)網(wǎng)站每個網(wǎng)頁每天的 UV 數(shù)據(jù),結(jié)合Redis你會如何實現(xiàn)?

    2023-06-13:統(tǒng)計高并發(fā)網(wǎng)站每個網(wǎng)頁每天的 UV 數(shù)據(jù),結(jié)合Redis你會如何實現(xiàn)?

    2023-06-13:統(tǒng)計高并發(fā)網(wǎng)站每個網(wǎng)頁每天的 UV 數(shù)據(jù),結(jié)合Redis你會如何實現(xiàn)? 答案2023-06-13: 如果統(tǒng)計 PV (頁面瀏覽量)那非常好辦,可以考慮為每個網(wǎng)頁創(chuàng)建一個獨立的 Redis 計數(shù)器,并將日期添加為鍵(key)的后綴。當(dāng)網(wǎng)頁收到請求時,對應(yīng)的計數(shù)器將被遞增。對于每天的

    2024年02月08日
    瀏覽(36)
  • Flink基于信用值的流量控制

    Flink基于信用值的流量控制

    flink內(nèi)部實現(xiàn)了一個類似于tcp滑動窗口概念的流量控制功能,以滿足其內(nèi)部的流量控制功能,本文就來講解下flink實現(xiàn)的基于信用值的流量控制的原理 首先,我們先來看一下在flink中是如何實現(xiàn)數(shù)據(jù)傳輸?shù)模?從上圖可知,發(fā)送端的taskmanager會為每個下游的算子的任務(wù)都創(chuàng)建一個

    2024年02月13日
    瀏覽(15)
  • 基于opencv深度學(xué)習(xí),交通目標(biāo)檢測,行人車輛檢測,人流統(tǒng)計,交通流量檢測

    基于opencv深度學(xué)習(xí),交通目標(biāo)檢測,行人車輛檢測,人流統(tǒng)計,交通流量檢測

    文章目錄 0 前言+ 1. 目標(biāo)檢測概況+ 1.1 什么是目標(biāo)檢測?+ 1.2 發(fā)展階段 2. 行人檢測+ 2.1 行人檢測簡介+ 2.2 行人檢測技術(shù)難點+ 2.3 行人檢測實現(xiàn)效果+ 2.4 關(guān)鍵代碼-訓(xùn)練過程 最后 設(shè)計項目案例演示地址: 鏈接 畢業(yè)設(shè)計代做一對一指導(dǎo)項目方向涵蓋: 1.1 什么是目標(biāo)檢測? 目標(biāo)檢

    2024年02月04日
    瀏覽(26)
  • 基于matomo實現(xiàn)業(yè)務(wù)數(shù)據(jù)埋點采集上報

    基于matomo實現(xiàn)業(yè)務(wù)數(shù)據(jù)埋點采集上報

    matomo是一款Google-analytics數(shù)據(jù)埋點采集上報的平替方案,可保護(hù)您的數(shù)據(jù)和客戶的隱私;正如它官網(wǎng)的slogan: Google Analytics alternative that protects your data and your customers\\\' privacy; 該項目源碼開源免費,支持私有化部署,保證數(shù)據(jù)安全、可靠;支持多種方式集成,不管你的應(yīng)用是傳統(tǒng)的

    2024年02月08日
    瀏覽(16)
  • [超詳細(xì)]基于YOLO&OpenCV的人流量統(tǒng)計監(jiān)測系統(tǒng)(源碼&部署教程)

    [超詳細(xì)]基于YOLO&OpenCV的人流量統(tǒng)計監(jiān)測系統(tǒng)(源碼&部署教程)

    [YOLOv7]基于YOLO&Deepsort的人流量統(tǒng)計系統(tǒng)(源碼&部署教程)_嗶哩嗶哩_bilibili (1)獲取原始視頻幀 (2)利用目標(biāo)檢測器對視頻幀中的目標(biāo)進(jìn)行檢測 (3)將檢測到的目標(biāo)的框中的特征提取出來,該特征包括表觀特征(方便特征對比避免ID switch)和運動特征(運動特征方 便卡爾

    2024年02月04日
    瀏覽(15)
  • 手把手教你實現(xiàn)—基于OpenCV的車流量統(tǒng)計和車速檢測代碼

    手把手教你實現(xiàn)—基于OpenCV的車流量統(tǒng)計和車速檢測代碼

    ?????????本章將實現(xiàn)了一個簡單的車輛速度估計和車流量統(tǒng)計的GUI應(yīng)用,它使用了Haar級聯(lián)檢測器和相關(guān)跟蹤器來檢測和跟蹤視頻中的車輛,并通過圖像處理和數(shù)學(xué)計算來估計車輛的速度。 ? ? ? ? 1.首先,該代碼需要cv2:用于圖像處理和計算機(jī)視覺任務(wù);dlib:用于對象

    2024年02月04日
    瀏覽(17)
  • 【Redis應(yīng)用】UV統(tǒng)計(四)

    【Redis應(yīng)用】UV統(tǒng)計(四)

    ??Redis應(yīng)用學(xué)習(xí)·第四站~ ??本文已收錄至專欄:Redis技術(shù)學(xué)習(xí) 首先我們要搞懂兩個概念: UV :全稱 Unique Visitor ,也叫 獨立訪客量 ,是指通過互聯(lián)網(wǎng)訪問、瀏覽這個網(wǎng)頁的自然人。1天內(nèi)同一個用戶多次訪問該網(wǎng)站,只記錄1次。 PV :全稱 Page View ,也叫 頁面訪問量或點擊量

    2024年02月09日
    瀏覽(32)
  • 使用 Redis 統(tǒng)計網(wǎng)站 UV 的方法

    文章目錄 前言 思路 HyperLogLog 使用 Redis 命令操作 使用 Java 代碼操作 HyperLogLog 實現(xiàn)原理及特點 使用 Java 實現(xiàn) HyperLogLog 小結(jié) 網(wǎng)站 UV 就是指網(wǎng)站的獨立用戶訪問量 Unique Visitor ,即相同用戶的多次訪問需要去重。 提到 UV 去重,猜大家都會想到 Set 集合類。 使用 Set 集合是一個不

    2024年02月08日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包