日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HIVE 调优1

發(fā)布時間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HIVE 调优1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

業(yè)務背景

用戶軌跡工程的性能瓶頸一直是etract_track_info,其中耗時大戶主要在于trackinfo與pm_info進行左關聯(lián)的環(huán)節(jié),trackinfo與pm_info兩張表均為GB級別,左關聯(lián)代碼塊如下:

[SQL]?純文本查看?復制代碼

?

1

2

3

from trackinfo a

left outer join pm_info b

on (a.ext_field7 = b.id)

使用以上代碼塊需要耗時1.5小時。


優(yōu)化流程
第一次優(yōu)化

考慮到pm_info表的id是bigint類型,trackinfo表的ext_field7是string類型,其關聯(lián)時數(shù)據(jù)類型不一致,默認的hash操作會按bigint型的id進行分配,這樣會導致所有string類型的ext_field7集中到一個reduce里面,因此,改為如下:

[SQL]?純文本查看?復制代碼

?

1

2

3

from trackinfo a

left outer join pm_info b

on (cast(a.ext_field7 as bigint) = b.id)

?

改動為上面代碼后,效果仍然不理想,耗時為1.5小時。

?

第二次優(yōu)化

?

考慮到trackinfo表的ext_field7字段缺失率很高(為空、字段長度為零、字段填充了非整數(shù))情況,做進行左關聯(lián)時空字段的關聯(lián)操作實際上沒有意義,因此,如果左表關聯(lián)字段ext_field7為無效字段,則不需要關聯(lián),因此,改為如下:

?

[Bash shell]?純文本查看?復制代碼

?

1

2

3

4

5

6

from trackinfo a

left outer join pm_info b

on (a.ext_field7 is not null

and length(a.ext_field7) > 0

and a.ext_field7 rlike '^[0-9]+$'

and a.ext_field7 = b.id)




上面代碼塊的作用是,如果左表關聯(lián)字段ext_field7為無效字段時(為空、字段長度為零、字段填充了非整數(shù)),不去關聯(lián)右表,由于空字段左關聯(lián)以后取到的右表字段仍然為null,所以不會影響結果。
改動為上面代碼后,效果仍然不理想,耗時為50分鐘。

第三次優(yōu)化

想了很久,第二次優(yōu)化效果效果不理想的原因,其實是在左關聯(lián)中,雖然設置了左表關聯(lián)字段為空不去關聯(lián)右表,但是這樣做,左表中未關聯(lián)的記錄(ext_field7為空)將會全部聚集在一個reduce中進行處理,體現(xiàn)為reduce進度長時間處在99%。
換一種思路,解決辦法的突破點就在于如何把左表的未關聯(lián)記錄的key盡可能打散,因此可以這么做:若左表關聯(lián)字段無效(為空、字段長度為零、字段填充了非整數(shù)),則在關聯(lián)前將左表關聯(lián)字段設置為一個隨機數(shù),再去關聯(lián)右表,這么做的目的是即使是左表的未關聯(lián)記錄,它的key也分布得十分均勻
?

[SQL]?純文本查看?復制代碼

?

01

02

03

04

05

06

07

08

09

10

11

12

from trackinfo a

left outer join pm_info b

on (

????case when (a.ext_field7 is not null

????????and length(a.ext_field7) > 0

????????and a.ext_field7 rlike '^[0-9]+$')

????then

????????cast(a.ext_field7 as bigint)

????else

????????cast(ceiling(rand() * -65535) as bigint)

????end = b.id

)



第三次改動后,耗時從50分鐘降為了1分鐘32秒,效果顯著!
?

總結

以上是生活随笔為你收集整理的HIVE 调优1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。