복붙노트

[HADOOP] 하이브 테이블 추가 또는 삭제 열 변경

HADOOP

하이브 테이블 추가 또는 삭제 열 변경

하이브에 orc 테이블이 있습니다.이 테이블에서 컬럼을 삭제하고 싶습니다.

ALTER TABLE table_name drop  col_name;

하지만 다음 예외가 발생합니다.

어느 누구라도 나를 도울 수 있습니까? 참고, 하이브 0.14를 사용하고 있습니다.

해결법

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

    1.ALTER TABLE table_name drop col_name;을 사용하여 테이블에서 열을 직접 삭제할 수 없습니다.

    ALTER TABLE table_name drop col_name;을 사용하여 테이블에서 열을 직접 삭제할 수 없습니다.

    열을 삭제하는 유일한 방법은 replace 명령을 사용하는 것입니다. 말하자면, 나는 id, name 및 dept 컬럼을 가진 테이블 emp를 가지고있다. 테이블 emp의 id 열을 삭제하려고합니다. 따라서 replace column 절에서 테이블의 일부가 되고자하는 모든 컬럼을 제공하십시오. 아래 명령은 emp 테이블의 id 열을 삭제합니다.

     ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
    
  2. ==============================

    2.외부 테이블 즉 당신이 있다고 가정 해 봅시다. organization.employee as : (TBLPROPERTIES 제외)

    외부 테이블 즉 당신이 있다고 가정 해 봅시다. organization.employee as : (TBLPROPERTIES 제외)

    hive> show create table organization.employee;
    OK
    CREATE EXTERNAL TABLE `organization.employee`(
          `employee_id` bigint,
          `employee_name` string,
          `updated_by` string,
          `updated_date` timestamp)
        ROW FORMAT SERDE
          'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
        STORED AS INPUTFORMAT
          'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
        OUTPUTFORMAT
          'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
        LOCATION
          'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'
    

    테이블에서 updated_by, updated_date 열을 제거하려고합니다. 이 차례를 따라라:

    organization.employee의 임시 테이블 복제본을 다음과 같이 작성하십시오.

    hive> create table organization.employee_temp as select * from organization.employee;
    

    메인 테이블 인 organization.employee를 삭제하십시오.

    hive> drop table organization.employee;
    

    HDFS에서 기본 데이터를 제거합니다 (하이브 셸에서 나올 필요가 있음).

    [nameet@ip-80-108-1-111 myfile]$ hadoop fs -rm hdfs://getnamenode/apps/hive/warehouse/organization.db/employee/*
    

    필요에 따라 제거 된 열이있는 테이블을 만듭니다.

    hive> CREATE EXTERNAL TABLE `organization.employee`(
      `employee_id` bigint,
      `employee_name` string)
    ROW FORMAT SERDE
      'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
    STORED AS INPUTFORMAT
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
    OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'
    

    원래 레코드를 원본 테이블에 다시 삽입하십시오.

    hive> insert into organization.employee 
    select employee_id, employee_name from organization.employee_temp;
    

    마지막으로 생성 된 임시 테이블 삭제

    hive> drop table organization.employee_temp;
    
  3. ==============================

    3.

    ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
    

    위의 명령문은 데이터가 아닌 테이블의 스키마 만 변경할 수 있습니다. 새로운 테이블에서 데이터를 복사하기위한이 문제의 해결책.

    Insert <New Table> Select <selective columns> from <Old Table> 
    
  4. ==============================

    4.또한 최종 목표를 달성하는 "멍청한"방법이 있습니다. 원하지 않는 컬럼을 사용하지 않고 새 테이블을 만드는 것입니다. Hive의 정규식 일치를 사용하면 쉽게 할 수 있습니다.

    또한 최종 목표를 달성하는 "멍청한"방법이 있습니다. 원하지 않는 컬럼을 사용하지 않고 새 테이블을 만드는 것입니다. Hive의 정규식 일치를 사용하면 쉽게 할 수 있습니다.

    내가 할 일은 다음과 같습니다.

    -- make a copy of the old table
    ALTER TABLE table RENAME TO table_to_dump;
    
    -- make the new table without the columns to be deleted
    CREATE TABLE table AS
    SELECT `(col_to_remove_1|col_to_remove_2)?+.+`
    FROM table_to_dump;
    
    -- dump the table 
    DROP TABLE table_to_dump;
    

    문제가되는 테이블이 너무 크지 않은 경우이 방법이 효과적입니다.

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

    5.네이티브가 아닌 테이블에 대해서는 ALTER TABLE이 아직 지원되지 않습니다. STORED BY 절이 지정된 경우 CREATE TABLE을 사용하여 얻는 결과.

    네이티브가 아닌 테이블에 대해서는 ALTER TABLE이 아직 지원되지 않습니다. STORED BY 절이 지정된 경우 CREATE TABLE을 사용하여 얻는 결과.

    https://cwiki.apache.org/confluence/display/Hive/StorageHandlers를 확인하십시오.

  6. ==============================

    6.쿼리 아래에서도 나를 위해 노력하고 있습니다.

    쿼리 아래에서도 나를 위해 노력하고 있습니다.

    Alter table tbl_name drop col_name
    
  7. from https://stackoverflow.com/questions/34198114/alter-hive-table-add-or-drop-column by cc-by-sa and MIT license