Hive - 열 회전 과 행 회전 열

1. 만약 에 우리 가 hive 에 두 장의 표 가 있다 고 가정 하면 그 중에서 한 장의 표 는 사용자 의 기본 정 보 를 저장 하 는 것 이 고 다른 한 장의 표 는 사용자 의 주소 정 보 를 저장 하 는 것 이다. 표 데 이 터 는 다음 과 같다.
user_basic_info:
id
name
1
a
2
b
3
c
4
d
user_address;
name
address
a
add1
a
add2
b
add3
c
add4
d
add5
우 리 는 같은 사용자 가 한 주소 만 있 는 것 을 볼 수 있 습 니 다. 우 리 는 데 이 터 를 다음 과 같은 형식 으로 바 꿔 야 합 니 다.
id
name
address
1
a
add1,add2
2
b
add3
3
c
add4
4
d
add5
collect_set
이것 은 hive 의 행 열 지식 을 사 용 했 습 니 다. UDF: collect 두 개 를 내장 해 야 합 니 다.set, concat_ws,
두 함수 의 설명 은 다음 과 같다.http://www.cnblogs.com/end/archive/2012/06/18/2553682.html
작성 표:
create table user_basic_info(id string, name string);
create table user_address(name string, address string);

데이터 불 러 오기:
load data local inpath '/home/jthink/work/workspace/hive/row_col_tran/data1' into table user_basic_info;
load data local inpath '/home/jthink/work/workspace/hive/row_col_tran/data2' into table user_address;

병합 실행:
select max(ubi.id), ubi.name, concat_ws(',', collect_set(ua.address)) as address from user_basic_info ubi join user_address ua on ubi.name=ua.name group by ubi.name;

실행 결과:
1       a       add1,add2 2       b       add3 3       c       add4 4       d       add5
2. 우리 가 표 한 장 을 가지 고 있다 고 가정 하면:
user_info:
id
name
address
1
a
add1,add2
2
b
add3
3
c
add4
4
d
add5
address 를 나 누 어 다음 으로 바 꿔 야 합 니 다.
id
name
address
1
a
add1
1
a
add2
2
b
add3
3
c
add4
4
d
add5
우 리 는 UDTF, explode () 를 사용 할 생각 을 하기 쉽다.
select explode(address) as address from user_info;
이렇게 실 행 된 결 과 는 address 뿐 이지 만 완전한 정보 가 필요 합 니 다.
select id, name, explode(address) as address from user_info;
이렇게 하 는 것 은 옳지 않다. UDTF's are not supported outside the SELECT clause, nor nested in expressions
그래서 우 리 는 이렇게 해 야 한다.
select id, name, add from user_info ui lateral view explode(ui.address) adtable as add;
결 과 는:
1       a       add1 1       a       add2 2       b       add3 3       c       add4 4       d       add5

좋은 웹페이지 즐겨찾기