복붙노트

[HADOOP] 파일에 열 수가 다른 경우 동일한 Hive 테이블에 데이터를로드하는 방법

HADOOP

파일에 열 수가 다른 경우 동일한 Hive 테이블에 데이터를로드하는 방법

열이 10 개인 기본 테이블 (직원)이 있고 /file1.txt의 데이터로드를 직원 테이블에로드하여 데이터를로드 할 수 있습니다.

내 질문은 file2.txt 파일에 동일한 열이 있지만 열 3과 열 5가없는 경우 동일한 테이블 (직원)을 처리하는 방법입니다. 데이터를 직접로드하면 마지막 열은 NULL NULL입니다. 그러나 대신 3 번째는 NULL로, 5 번째 열은 NULL로로드해야합니다.

Employee 테이블이 있고 file1.txt 및 file2.txt를 테이블에로드하려고한다고 가정하십시오.

file1.txt
==========
id name sal deptid state coutry  
1  aaa  1000 01   TS   india  
2  bbb  2000 02   AP   india  
3  ccc  3000 03   BGL   india  


file2.txt  

id  name   deptid country  
1  second   001   US  
2  third    002   ENG  
3  forth    003   AUS  

file2.txt에는 sal 및 state라는 두 개의 열이 없습니다.

동일한 Employee 테이블을 사용하여 처리하는 방법이 필요합니까?

해결법

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

    1.비균질 구조의 데이터 파일이 지원하는 테이블을 만드는 방법을 모릅니다. 그러나 수행 할 수있는 것은 서로 다른 열 구성에 대해 별도의 테이블을 정의한 다음 둘 다를 쿼리하는 뷰를 정의하는 것입니다.

    비균질 구조의 데이터 파일이 지원하는 테이블을 만드는 방법을 모릅니다. 그러나 수행 할 수있는 것은 서로 다른 열 구성에 대해 별도의 테이블을 정의한 다음 둘 다를 쿼리하는 뷰를 정의하는 것입니다.

    예를 제공하면 더 쉽다고 생각합니다. 나는 두 사람의 테이블을 사용할 것입니다. 둘 다 이름에 대한 열이 있지만 하나의 매장 높이도 있고 다른 매장의 무게는 다음과 같습니다.

    > create table table1(name string, height int);
    > insert into table1 values ('Alice', 178), ('Charlie', 185);
    
    > create table table2(name string, weight int);
    > insert into table2 values ('Bob', 98), ('Denise', 52);
    
    > create view people as
    >     select name, height, NULL as weight from table1
    >   union all
    >     select name, NULL as height, weight from table2;
    
    > select * from people order by name;
    +---------+--------+--------+
    | name    | height | weight |
    +---------+--------+--------+
    | Alice   | 178    | NULL   |
    | Bob     | NULL   | 98     |
    | Charlie | 185    | NULL   |
    | Denise  | NULL   | 52     |
    +---------+--------+--------+
    

    또는 문제에 대한 더 가까운 예로서, 하나의 테이블에는 이름, 높이 및 무게가 있고 다른 테이블에는 이름 및 무게 만 있으므로 높이가 "중간에서 누락"되었다고 가정 해 봅시다.

    > create table table1(name string, height int, weight int);
    > insert into table1 values ('Alice', 178, 55), ('Charlie', 185, 78);
    
    > create table table2(name string, weight int);
    > insert into table2 values ('Bob', 98), ('Denise', 52);
    
    > create view people as
    >     select name, height, weight from table1
    >   union all
    >     select name, NULL as height, weight from table2;
    
    > select * from people order by name;
    +---------+--------+--------+
    | name    | height | weight |
    +---------+--------+--------+
    | Alice   | 178    | 55     |
    | Bob     | NULL   | 98     |
    | Charlie | 185    | 78     |
    | Denise  | NULL   | 52     |
    +---------+--------+--------+
    

    후자는 중복 행을 제거하려고 시도하기 때문에 공용체가 아닌 공용체를 모두 사용해야합니다.

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

    2.지정된 열에 직접로드 할 수있는 방법이없는 것 같습니다.

    지정된 열에 직접로드 할 수있는 방법이없는 것 같습니다.

    따라서 이것은 아마도 당신이해야 할 일입니다.

    상황은 반대 시나리오를 다루는이 질문과 매우 유사합니다 (몇 열만로드하려는 경우).

  3. from https://stackoverflow.com/questions/39580335/how-to-load-data-to-same-hive-table-if-file-has-different-number-of-columns by cc-by-sa and MIT license