2016-11-29 2 views
0
  • Ich verwende Hive 1.2.1000.2.4.2.0-258.
  • Es gibt 4850000+ Zeilen in der Tabelle, 14511 Reihen von A zwischen 73 und 74, und 3 cols- group_id, A und B.
  • GROUP_ID ist eigentlich gleich 0.
  • fast alle von A und B sind ganze Zahlen.

Ich wurde mit den folgenden Scripts Statistik Zusammenfassungen aus einer Tabelle zu finden:Hive Percentile_approx Funktion ist kaputt, nicht wahr?

select group_id, --group_id=0 a constant 
    percentile_approx(A , 0.5) as A_mdn, 
    percentile_approx(A , 0.25) as A_Q1, 
    percentile_approx(A , 0.75) as A_Q3, 
    percentile_approx(A , array(0.2,0.15, 0.1,0.05,0.025,0.001)) as A_i, 
    min(A) as min_A, 
    percentile_approx(B , 0.5) as B_mdn, 
    percentile_approx(B , 0.25) as B_Q1, 
    percentile_approx(B , 0.75) as B_Q3, 
    percentile_approx(B , array(0.8,0.85, 0.9, 0.95,0.975)) as B_i 
    from table 
    group by group_id; 

Das Ergebnis was ich habe ist:

0 
73.21058033222496 
73.21058033222496 
462.16968382794516 
[73.21058033222496,73.21058033222496,73.21058033222496,73.21058033222496,73.21058033222496,73.21058033222496] 
0.0 
1.0 
1.0 
2.0 
[2.0,3.0,4.0,8.11278644563614,17.0] 

Dann wechsle ich den Code wie folgt:

select group_id, --group_id=0 a constant 
    percentile(cast(A as bigint), 0.5) as A_mdn, 
    percentile(cast(A as bigint), 0.25) as A_Q1, 
    percentile(cast(A as bigint), 0.75) as A_Q3, 
    percentile(cast(A as bigint), array(0.2,0.15, 0.1,0.05,0.025,0.001)) as A_i, 
    min(A) as min_A, 
    percentile(cast(B as bigint), 0.5) as B_mdn, 
    percentile(cast(B as bigint), 0.25) as B_Q1, 
    percentile(cast(B as bigint), 0.75) as B_Q3, 
    percentile(cast(B as bigint), array(0.8,0.85, 0.9, 0.95,0.975)) as B_i 
    from table 
    group by group_id 

Das neue Ergebnis ist:

0 
72.0  
6.0 
762.0  
[3.0,1.0,1.0,0.0,0.0,0.0] 
0.0 
1.0 
1.0 
2.0 
[2.0,3.0,4.0,9.0,17.0] 

zu verdoppeln, die Wahrheit zu überprüfen, wir laden auch diese Tabelle R. Im Anschluss an dem R-Ergebnis:

A: 
Min 0 
Q1: 6 
Median: 72 
Q3: 762 
0.2 quantile: 3 
0.15 quantile: 1.5 
0.1 quantile: 1 
0.05 quantile: 0 
0.025 quantile:0 
0.001 quantile:0 

B 
Q1: 1 
Median: 1 
Q3: 2 
0.8 quantile: 2  
0.85 quantile: 3 
0.9 quantile: 4 
0.95 quantile: 9 
0.975 quantile:17 

Offensichtlich R Ergebnis steht im Einklang mit Perzentil-Funktion, aber percentile_approx gibt mir den falsche Antwort.

Antwort

0

Diese Funktion gibt einen wahren Wert zurück, wenn "alle" Werte Ganzzahlen sind. Sie sagten, dass fast alle von A und B ganze Zahlen sind.

Versuchen Sie, die komplette Spalte A nach int zu übertragen und zu sehen, ob Sie der Antwort nahe kommen.

Ich denke nicht, Sie werden jemals genau die gleiche Antwort wie R erhalten, weil die Perzentilfunktion von R höchstwahrscheinlich auch Nicht-Ganzzahlen annimmt.

Eine Möglichkeit, die genaue Antwort zu erhalten, wäre, eigene UDF zu schreiben und stattdessen zu verwenden.

Hoffe, das hilft!

+0

Mein Punkt ist, dass Ergebnis von Perzentil_approx falsch ist, nicht einmal ein "approx". –

+0

Versuchen Sie Folgendes: percenttile_approx (A, 0,5,) als A_mdn – AkashNegi

+0

Ignorieren Sie den obigen Kommentar. Versuchen Sie Folgendes: perzentil_approx (A, 0,5, [, 5000000]) als A_mdn. Der Parameter '5000000' sollte> Anzahl der unterschiedlichen Datensätze im Dataset sein. Sie haben gesagt, dass Sie 4.85m + Datensätze haben, also versuchen Sie, den obigen Befehl auszuführen und sehen Sie, ob die Ergebnisse näher sind. – AkashNegi