2014-09-11 9 views

Odpowiedz

3

W gałęzi domyślnie ciąg jest VARCHAR (32762), więc oznacza to,

  • jeśli wartość przekracza 32762, to wartość jest obcinany
  • jeżeli dane nie wymaga maksymalnej długości VARCHAR do przechowywania (na Przykładowo, jeśli kolumna nie przekracza 100 znaków), to przydziela niepotrzebnych zasobów do obsługi tej kolumnie

domyślne zachowanie dla typu danych STRING jest mapowanie typu do typu danych SQL VARCHAR (32762) , domyślne zachowanie c prowadzą do wydajności wystawia

To wyjaśnienie jest w oparciu o IBM BIG SQL, który używa gałąź implictly

IBM BIGINSIGHTS doc reference

+0

Dlaczego to jest 32762, a nie 2^15-1? – maxx777

+0

@ maxx777as mapuje typ danych SQL, dlatego raczej niż normalny ciąg języka programowania. –

0

varchar typ danych jest również zapisane wewnętrznie jako ciąg znaków. Jedyną różnicą, jaką widzę jest String jest nieograniczony z maksymalną wartością 32 767 bajtów, a Varchar jest ograniczony maksymalną wartością 65 535 bajtów. Nie sądzę, że będziemy mieli jakiekolwiek zwiększenie wydajności, ponieważ wewnętrzna implementacja obu przypadków to String. Nie wiem zbyt wiele o wewnętrznych układach ula, ale widziałem dodatkowe przetwarzanie wykonywane przez gałąź dla obcinania wartości varchar. Poniżej znajduje się kod (org.apache.hadoop.hive.common.type.HiveVarchar): -

public static String enforceMaxLength(String val, int maxLength) { 
String value = val; 

if (maxLength > 0) { 
    int valLength = val.codePointCount(0, val.length()); 
    if (valLength > maxLength) { 
    // Truncate the excess chars to fit the character length. 
    // Also make sure we take supplementary chars into account. 
    value = val.substring(0, val.offsetByCodePoints(0, maxLength)); 
    } 
} 
return value; 
} 

Jeśli ktoś dokonał analizy wydajności/benchmarking proszę podzielić.