복붙노트

[HADOOP] 하이브에서 열 유형 변경

HADOOP

하이브에서 열 유형 변경

방금 어제 하이브를 배우기 시작했고 하이브의 열 유형을 변경하는 데 집중했습니다. int를 double로, string을 double로, double을 문자열로 변환 할 수 있지만 문자열을 int, double로 변경할 수없는 것처럼 특정 유형의 변경 만 수행 할 수 있기 때문에 열 유형 변경에 대한 제한이 있는지 묻고 싶었습니다. int.

ALTER TABLE student CHANGE rollno rollno int;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :
rollno

hive> DESCRIBE FORMATTED student
> ;
OK
# col_name              data_type               comment             

rollno                  int                                         
name                    string                                      
phno                    string                                      
city                    string   

    ALTER TABLE student CHANGE rollno rollno double;
OK
Time taken: 0.144 seconds

ALTER TABLE student CHANGE rollno rollno int;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :

rollno

캔트도 문자열로 할 수 있습니다. 그래서 구글을 통해 아무것도 찾을 수없는 것처럼 대답으로 나를 안내하십시오.

해결법

  1. ==============================

    1.데이터베이스 (Teradata에서 작업 한)는 일반적으로 열 데이터 유형을 높은 순서에서 낮은 순서로 수정하거나 데이터 유형이 이미 저장되어 있거나 테이블에 저장된 데이터와 충돌 할 수있는 경우를 허용하지 않습니다. 예 : 새로운 수정 데이터 유형이 테이블의 기존 데이터를 처리 할 수 ​​있으므로 int 열을 이중 열로 수정할 수 있습니다. int 열이 이중 데이터를 보유 할 수 없기 때문에 int로 이중 열을 수정하면 문제가 발생할 수 있습니다.

    데이터베이스 (Teradata에서 작업 한)는 일반적으로 열 데이터 유형을 높은 순서에서 낮은 순서로 수정하거나 데이터 유형이 이미 저장되어 있거나 테이블에 저장된 데이터와 충돌 할 수있는 경우를 허용하지 않습니다. 예 : 새로운 수정 데이터 유형이 테이블의 기존 데이터를 처리 할 수 ​​있으므로 int 열을 이중 열로 수정할 수 있습니다. int 열이 이중 데이터를 보유 할 수 없기 때문에 int로 이중 열을 수정하면 문제가 발생할 수 있습니다.

    예 :이 데이터 유형은 광범위한 데이터를 보유 할 수 있으므로 모든 (거의) 열을 문자열 데이터 유형으로 수정할 수 있습니다. double, float, int 유형의 모든 데이터는 문자열로 표시 될 수 있으므로이 변환은 대부분 허용됩니다.

    예 : 3-또 다른 사례는 CHAR에서 CHAR 로의 변환이 때때로 실패한다는 것입니다. 언제 그리고 왜? 길이 (CHAR (20)을 CHAR (10)로 낮추려고 시도하는 경우에만 실패하지만 (CHAR (10)을 CHAR (20)으로 업그레이드하려고 할 때 정상적으로 작동합니다. 이 검사는 테이블의 데이터 길이가 새 데이터 유형 길이보다 큰 경우 데이터가 잘리지 않는 데이터 무결성을 유지합니다.

    왜 Hive가 문자열을 두 배로 변환하는지에 대해 약간 놀랐습니다. 나는 이것을 시도했고 데이터 유형이 문자열에서 이중으로 변환 될 때 문자열 값에 대해 NULL을 강제합니다.

  2. ==============================

    2.암시 적 변환에 신경 쓰지 않고 열 유형 만 변경하려는 경우 예를 들어 이전 열 유형이 잘못되었습니다.

    암시 적 변환에 신경 쓰지 않고 열 유형 만 변경하려는 경우 예를 들어 이전 열 유형이 잘못되었습니다.

    당신은 이것을 시도 할 수 있습니다 :

    set hive.metastore.disallow.incompatible.col.type.changes=false;
    
  3. ==============================

    3.문자열을 int로 변환하거나 double에서 int로 변환 할 수 없습니다.

    문자열을 int로 변환하거나 double에서 int로 변환 할 수 없습니다.

    Hive에서 허용되는 암시 적 변환을 참조 할 수 있습니다.

    그것은 가능한 모든 것을 당신에게 전체 목록을 제공합니다.

  4. ==============================

    4.페이지 끝에이 링크를 따라 가면 내재적으로 변환 할 수있는 테이블이 있습니다.

    페이지 끝에이 링크를 따라 가면 내재적으로 변환 할 수있는 테이블이 있습니다.

    언어 유형 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

    간단히 말해 '큰'유형을 특정 코드가없는 '작은'유형으로 변환 할 수는 없습니다.

  5. ==============================

    5.문자열에 문자가 포함되어 있고이를 int로 변환 할 수 없으므로 문자열을 int로 변환 할 수 없습니다. 데이터가 변환에서 손실 될 수 있으므로 하이브에서는 Double to int 변환이 불가능합니다.

    문자열에 문자가 포함되어 있고이를 int로 변환 할 수 없으므로 문자열을 int로 변환 할 수 없습니다. 데이터가 변환에서 손실 될 수 있으므로 하이브에서는 Double to int 변환이 불가능합니다.

    예 : 열 유형이 int이고 값이

    1

    2

    3

    열 유형을 double로 변환하려면 값이 다음과 같이 변환됩니다.

    1.0

    2.0

    3.0

    변환 후에도 데이터 손실이 없습니다.

    그러나 열 데이터 유형은 두 배이며 값을

    1.2

    2.0

    3.5

    4.1

    그리고 우리는 열이 int이 값을 다음과 같이 변환하기를 원합니다.

    1

    2

    3

    4

    데이터가 손실 될 것입니다. 그렇기 때문에 하이브는 int 변환을 두 배로 할 수 없습니다.

  6. from https://stackoverflow.com/questions/36837266/change-column-type-in-hive by cc-by-sa and MIT license