閱讀457 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ComputeColStats UDF中 近似算法的介紹(續)

在前一篇文章的最後提到,對於準確率的提升是後續需要做的事情之一。接下來看看對於提升準確率,還有哪些事情可以做。

一,回顧

首先回顧下前一篇文章最後得到的結果,如下:
b01
執行時間先忽略,隻看準確率。對於上麵8個字段,有些在sample為25(采樣比例1/25)的情況下還是相當準確的,比如odps_task_type,start_time;而有些則存在一定差距,比如project_name,fuxi_ceil_mem等;還有些存在比較大的差距,比如odps_inst_id,fuxi_avg_cpu。同樣的采樣算法,同樣的估計算法,對於不同的數據會得到截然不同的結果。這種差異相信決大部分來自於數據本身。
下麵就從數據本身來看下到底差異是如何出現的。

二,數據差異

不同的字段存儲的數據不同,不同數據可能會存在唯一值上的差異。比如說對於主鍵,比如說對於緯度直,兩者肯定在DistinctValue的分布上肯定是完全不同的。

1,如果該字段為主鍵,那麼RowCount(X軸)和DistinctValue(Y軸)關係類似下圖:

b02
這是一條斜率為1的直線。
對於這種情況,目前的算法肯定可以非常準確的估算出DistinctValue值。

2,如果該字段為緯度值(唯一值非常少),那麼RowCount(X軸)和DistinctValue(Y軸)關係類似下圖:

b03
隨著RowCount的增加,DistinctValue也在增加,但到了某個點後DistinctValue基本保持不變。

3,如果該字段為一般字段,隨著RowCount的增加而DistinctValue也緩慢增加,類似下圖:

b04

三,數據差異導致的DistinctValue的計算誤差?

上麵一部分列舉了三種可能的RowCount和DistinctValue關係。第一種類型是比較簡單的,也能很準確的估算出DistinctValue值。而對於第二種和第三種則要困難的多,從測試的結果來看是這樣的。
我們采樣的前提是,采樣算法能保證采樣是隨機的,每條數據被訪問的幾率是相同的。但實際上這樣的前提是不存在的。這也是目前對第三種的估算也可能存在較大差異的原因。因為按道理來說,其實第三種我們也應該能很好的預估才對。目前的采樣算法並不是隨機的,數據本身分布對采樣的結果影響極大。為了性能和實現起來簡單,目前采樣的算法是隔n條取1條的方式實現的,並不是真正意義上的隨機采樣。
針對同一次估算過程,我嚐試過不同的擬合回歸算法,結果並沒有特別的不同,問題並不是在算法上,而是在數據本身上。下麵通過對存在較大誤差的fuxi_avg_cpu來看下,不同的采樣比例下的RowCount和DistinctValue關係的差異。
b05
b06
b07
b08
上麵幾張圖對下對比,能看得出來在不同的采樣比例下圖形的狀態會有很大的變化。差異這麼大的話想要比較準確的預估顯然是不太現實的。

四,總結

目前看來DistinctValue估算的差異大部分原因是因為采樣,想要提高準確率增加采樣比例就可以了。而具體回歸的算法,則沒那麼重要了。

最後更新:2017-07-25 11:02:50

  上一篇:go  針對GZIP文件類型的並行讀取
  下一篇:go  阿裏上班不打卡,任性進內網,全靠一個“男人”?!