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

SQL_求店鋪的topN && 開窗函數(shù)數(shù)據(jù)傾斜

這篇具有很好參考價值的文章主要介紹了SQL_求店鋪的topN && 開窗函數(shù)數(shù)據(jù)傾斜。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

某互聯(lián)網(wǎng)大廠的一道比較有深度的面試題,

參考文章 :?hive|性能優(yōu)化|_Hive ROW_NUMBER TopN 性能優(yōu)化

問題

有50W個 店鋪,每個顧客訪客訪問任何一個店鋪的任何一個商品時都會產(chǎn)生一條訪問日志,
訪問日志存儲的表名為Visit,訪客的用戶id為user_id,被訪問的店鋪名稱為shop,數(shù)據(jù)如下:

? ? ? ? ? ? ? ? user_id shop

????????????????u1 ?a
? ? ? ? ? ? ? ? u2 ?b
? ? ? ? ? ? ? ? u1 ?b
? ? ? ? ? ? ? ? u1 ?a
? ? ? ? ? ? ? ? u3 ?c
? ? ? ? ? ? ? ? u4 ?b
? ? ? ? ? ? ? ? u1 ?a
? ? ? ? ? ? ? ? u2 ?c
? ? ? ? ? ? ? ? u5 ?b
請統(tǒng)計(jì):
(1)每個店鋪的UV(訪客數(shù))
(2)每個店鋪訪問次數(shù)top3的訪客信息。輸出店鋪名稱、訪客id、訪問次數(shù)

問題(1)解法

問題一的目的是考察能否在大數(shù)據(jù)量下考慮用 group做去重預(yù)聚合,而不是直接用count(distinct)

正確解法?

with?
user_dist_log as (
?? ?select?
?? ??? ?user_id,
?? ??? ?shop,
?? ??? ?count(1) as pv_cnt
?? ?from visit
?? ?group by?
?? ??? ?user_id,
?? ??? ?shop
)

select?
?? ?shop,
?? ?count(1) as uv?
from user_dist_log
group by shop;

問題(2)解法

問題二的目的是考察開窗函數(shù)情況下的數(shù)據(jù)傾斜如何解決
由于開窗函數(shù)是把數(shù)據(jù)分發(fā)到同一個 executor 進(jìn)行單點(diǎn)的數(shù)據(jù)排序,那么熱點(diǎn)數(shù)據(jù)很容易導(dǎo)致數(shù)據(jù)傾斜,所以這里的解決方案是2步聚合的方式,加鹽打散,二次聚合。

具體代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-606728.html

with
user_dist_log as (
	select 
		user_id,
		shop,
		count(1) as pv_cnt
	from visit
	group by 
		user_id,
		shop
)



select 
    shop,
    user_id,
    shop_rank2
from 
(
    select 
        shop,
        user_id,
        row_number() over(partition by shop order by pv_cnt desc) as shop_rank2
    from 
    (
        select 
            shop,
            rand1,
            user_id,
            pv_cnt 
        from 
        (
            select 
                shop,
                ceil(rand()*100) as rand1,
                user_id,
                pv_cnt,
                row_number() over(partition by shop, ceil(rand()*100) order by pv_cnt desc) as shop_rank
            from user_dist_log
        ) mid_tmp
        where shop_rank <= 3
    )
)
where shop_rank2 <= 3

測試數(shù)據(jù)構(gòu)建

with 
visit as (
    select 
        'u1' as user_id,
        'a' as shop
    union all 
    select 
        'u2' as user_id,
        'b' as shop
    union all 
    select 
        'u1' as user_id,
        'b' as shop
    union all 
    select 
        'u1' as user_id,
        'a' as shop
    union all 
    select 
        'u3' as user_id,
        'c' as shop
    union all 
    select 
        'u4' as user_id,
        'b' as shop
    union all 
    select 
        'u1' as user_id,
        'a' as shop
    union all 
    select 
        'u2' as user_id,
        'c' as shop
    union all 
    select 
        'u5' as user_id,
        'b' as shop
),

到了這里,關(guān)于SQL_求店鋪的topN && 開窗函數(shù)數(shù)據(jù)傾斜的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SQL 的window開窗函數(shù)簡單使用

    SQL 的window開窗函數(shù)簡單使用

    開窗函數(shù)不論是spark的還是clickhouse的在日常的查詢中是一個很常用的功能,特別是他想要解決的問題和group by的很類似,這兩種容易引起混淆,本文就簡單的描述下開窗函數(shù)的簡單用法 首先窗口函數(shù)和group by是完全沒有交集的,他們完全沒有任何關(guān)系,group by聚合數(shù)據(jù)后會導(dǎo)致

    2024年02月09日
    瀏覽(48)
  • SQL使用技巧(6)HIVE開窗函數(shù)

    SQL使用技巧(6)HIVE開窗函數(shù)

    開窗函數(shù)的使用鐵律:不要濫用 先想明白自己要實(shí)現(xiàn)什么樣的功能,然后再去實(shí)踐。沒有目的的嘗試段不可取,會難以理解各開窗函數(shù)的真正用法。 如果沒有現(xiàn)成可用HIVE庫,可以參見本人 大數(shù)據(jù)單機(jī)學(xué)習(xí)環(huán)境搭建 系列文章。 1.1Hive建表 1.2數(shù)據(jù)準(zhǔn)備 1.3保存為HDFS文件 1.4驗(yàn)證

    2024年02月08日
    瀏覽(25)
  • hive sql—開窗函數(shù)—累積求和和滑動求和

    hive sql—開窗函數(shù)—累積求和和滑動求和

    數(shù)據(jù)集有三列數(shù)據(jù),姓名、月份和數(shù)量: 圖1 使用 sum() 函數(shù)和 over() 來實(shí)現(xiàn),如下: 結(jié)果如下: 同一個name,后一個月份都是前幾個月份的累加和 圖2 需要稍微騷一點(diǎn)的操作,加上一個限制條件: 數(shù)字:可正可零可負(fù),正往前,負(fù)向后;preceding:向前幾行;following:向后幾行

    2024年02月11日
    瀏覽(31)
  • 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(二十七):數(shù)倉報表場景?通過對移動范圍進(jìn)行聚集來詳解分析函數(shù)開窗原理以及如何一個SQL打印九九乘法表

    【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(一):關(guān)于SQL不得不說的那些事 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(二):簡單單表查詢 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(三):SQL排序的那些事 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(四):從執(zhí)行計(jì)劃討論UNION ALL與空字符串UNION與OR的使用注意事項(xiàng) 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列

    2023年04月09日
    瀏覽(27)
  • Flink SQL TopN

    Flink SQL 對于批處理(Batch)和流處理(streaming)模式的SQL,都支持 Top-N 查詢。 Top-N 查詢可以根據(jù)指定列排序后獲得前 N 個最小或最大值。并且該結(jié)果集還可用于進(jìn)一步分析。 Flink 使用 OVER 窗口子句和過濾條件的組合來表達(dá)一個 Top-N 查詢。借助 OVER 窗口的 PARTITION BY 子句能力

    2024年02月12日
    瀏覽(17)
  • SQL分組后取topN

    SQL分組后取topN

    求每門課程中成績最好的人 使用窗口函數(shù): 利用表鏈接 使用子查詢 求每門課程成績前兩人 使用窗口函數(shù): 使用自身左鏈接 結(jié)果: 這是對CID分組,按分?jǐn)?shù)排名的表 上圖中3中不同的排名方式,對應(yīng)sql窗口函數(shù)的三種 row_number : 就是按1-2-3順序排 rank:就是按 1-1-3 排列--這就是?

    2024年02月10日
    瀏覽(19)
  • flink sql 實(shí)戰(zhàn)實(shí)例 及延伸問題:聚合/數(shù)據(jù)傾斜/DAU/Hive流批一體 等

    flink sql 實(shí)戰(zhàn)實(shí)例 及延伸問題:聚合/數(shù)據(jù)傾斜/DAU/Hive流批一體 等

    ? 需求:上游是一個 kafka 數(shù)據(jù)源,數(shù)據(jù)內(nèi)容是用戶 QQ 等級變化明細(xì)數(shù)據(jù)(time,uid,level)。需要你求出當(dāng)前每個等級的用戶數(shù)。 ? 需求:數(shù)據(jù)源:用戶心跳日志(uid,time,type)。計(jì)算分 Android,iOS 的 DAU,最晚一分鐘輸出一次當(dāng)日零點(diǎn)累計(jì)到當(dāng)前的結(jié)果。 經(jīng)過測試 在fl

    2024年02月22日
    瀏覽(34)
  • ORACLE數(shù)據(jù)庫 開窗函數(shù)

    開窗函數(shù) 2.1開窗函數(shù)的定義及語法 開窗函數(shù)(又名:分析函數(shù),窗口函數(shù),OLAP函數(shù)) 聚合函數(shù):將數(shù)據(jù)按照一定的規(guī)則分組,統(tǒng)一分析各組的某項(xiàng)情況,每個分組返回一行結(jié)果 開窗函數(shù):將數(shù)據(jù)按照一定的規(guī)則分組,統(tǒng)一分析各組的某項(xiàng)情況,每行數(shù)據(jù)返回一行結(jié)果 (

    2024年02月11日
    瀏覽(29)
  • SQL | 使用函數(shù)處理數(shù)據(jù)

    SQL | 使用函數(shù)處理數(shù)據(jù)

    8.1-函數(shù) SQL可以用函數(shù)來處理數(shù)據(jù)。函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,為數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。 8.1.1 函數(shù)帶來的問題 每種DBMS都有特定的函數(shù),只有很少一部分函數(shù),是被所有主要的DBMS等同的支持。 雖然所有的類型的函數(shù)一般都可以在每個DBMS中使用,但每個函數(shù)的名稱

    2024年02月12日
    瀏覽(22)
  • MySQL8.0數(shù)據(jù)庫開窗函數(shù)

    MySQL8.0數(shù)據(jù)庫開窗函數(shù)

    ? ? ? 數(shù)據(jù)庫開窗函數(shù)是一種在SQL中使用的函數(shù),它可以用來對結(jié)果集中的數(shù)據(jù)進(jìn)行分組和排序,以便更好地分析和處理數(shù)據(jù)。開窗函數(shù)與聚合函數(shù)不同,它不會將多行數(shù)據(jù)聚合成一行,而是保留每一行數(shù)據(jù),并對其進(jìn)行分組和排序。 常見的開窗函數(shù)包括ROW_NUMBER()、RANK()、

    2024年02月08日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包