Hive HQL 연습

6236 단어 Hive
테스트 데이터
course.txt
1,   
2,  
3,    
4,    
5,    
6,    

sc.txt
95001,1,81
95001,2,85
95001,3,88
95001,4,70
95002,2,90
95002,3,80
95002,4,71
95002,5,60
95003,1,82
95003,3,90
95003,5,100
95004,1,80
95004,2,92
95004,4,91
95004,5,70
95005,1,70
95005,2,92
95005,3,99
95005,6,87
95006,1,72
95006,2,62
95006,3,100
95006,4,59
95006,5,60
95006,6,98
95007,3,68
95007,4,91
95007,5,94
95007,6,78
95008,1,98
95008,3,89
95008,6,91
95009,2,81
95009,4,89
95009,6,100
95010,2,98
95010,5,90
95010,6,80
95011,1,81
95011,2,91
95011,3,81
95011,4,86
95012,1,81
95012,3,78
95012,4,85
95012,6,98
95013,1,98
95013,2,58
95013,4,88
95013,5,93
95014,1,91
95014,2,100
95014,4,98
95015,1,91
95015,3,59
95015,4,100
95015,6,95
95016,1,92
95016,2,99
95016,4,82
95017,4,82
95017,5,100
95017,6,58
95018,1,95
95018,2,100
95018,3,67
95018,4,78
95019,1,77
95019,2,90
95019,3,91
95019,4,67
95019,5,87
95020,1,66
95020,2,99
95020,5,93
95021,2,93
95021,5,91
95021,6,99
95022,3,69
95022,4,93
95022,5,82
95022,6,100

students.txt
95001,  , ,20,CS
95002,  , ,19,IS
95003,  , ,22,MA
95004,  , ,19,IS
95005,  , ,18,MA
95006,  , ,23,CS
95007,   , ,19,MA
95008,  , ,18,CS
95009,   , ,18,MA
95010,   , ,19,CS
95011,   , ,18,MA
95012,  , ,20,CS
95013,  , ,21,CS
95014,   , ,19,CS
95015,  , ,18,MA
95016,  , ,21,MA
95017,   , ,18,IS
95018,  , ,19,IS
95019,   , ,19,IS
95020,  , ,21,IS
95021,  , ,17,MA
95022,  , ,20,MA

아래 문 구 를 사용 하여 표를 만 듭 니 다.
create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row format delimited fields terminated by ','stored as textfile;

create table course(Cno int,Cname string) row format delimited fields terminated by ',' stored as textfile;

create table sc(Sno int,Cno int,Grade int)row format delimited fields terminated by ',' stored as textfile;

다음 명령 을 사용 하여 데 이 터 를 가 져 옵 니 다:
load data local inpath '/root/sql_learn/students.txt' overwrite into table student;

load data local inpath '/root/sql_learn/sc.txt' overwrite into table sc;

load data local inpath '/root/sql_learn/course.txt' overwrite into table course;

전체 학생 의 학 번 과 성명 을 조회 하 다
select Sno,Sname from student;

선택 과목 을 이수 한 학생 의 성명 을 조회 하 다.
select distinct Sname from student inner join sc on(student.Sno=sc.Sno);

학생 의 총 인원 을 조회 하 다
select count(1) from student;

1 번 과정의 학생 평균 성적 을 계산 하 다.
select avg(Grade) from sc group by Cno having Cno=1;

각 과목 의 성적 평균 점 수 를 조회 하 다.
select Cname,avg(Grade) as average 
from course inner join sc on (course.Cno=sc.Cno) 
group by course.Cname,sc.Cno;

여기 서 한 가지 방법 을 배 웠 습 니 다. selection 후의 필드 는 group by 에 포함 되 거나 취 합 함 수 를 사용 해 야 합 니 다.
1 번 과정 을 선택 과목 으로 이수 한 학생 의 최고 점 수 를 조회 하 다.
select Grade from sc where Cno=1 order by Grade desc limit 1;

그리고 조사해 보 니 order by 는 하나의 reducer 로 만 임 무 를 완성 할 수 있 고 아래 의 문 구 를 사용 하여 효율 을 높 일 수 있 습 니 다.
select Grade from sc where Cno=1 distribute by Grade sort by Grade desc limit 1;

원 리 는 sort by 에서 그룹 정렬 을 사용 하 는 것 입 니 다.Grade 에 따라 Hash 를 진행 하고 결 과 를 같은 것 을 다른 Reducer 에 넣 습 니 다.
그러나 주의해 야 할 것 은 sort by 로 정렬 하고 mapred. reduce. tasks > 1 을 설정 하면 sort by 는 모든 reducer 의 출력 질서 만 확보 하고 전체 질서 가 보장 되 지 않 습 니 다.sort by 는 orderby 와 다 릅 니 다. Hive. mapred. mode 속성의 영향 을 받 지 않 습 니 다. sort by 의 데 이 터 는 같은 reduce 에 있 는 데 이 터 를 지정 한 필드 에 따라 정렬 할 수 있 습 니 다.sort by 를 사용 하면 실 행 된 reduce 개 수 를 지정 할 수 있 습 니 다 (set mapred. reduce. tasks = n 을 통 해 지정). 출력 된 데 이 터 를 다시 실행 하고 정렬 하면 모든 결 과 를 얻 을 수 있 습 니 다.
Distribute by 와 sort by 의 사용 장면
  • Map 에서 출력 한 파일 의 크기 가 고 르 지 않 습 니 다.
  • Reduce 출력 파일 의 크기 가 고 르 지 않 습 니 다.
  • 작은 문서 가 너무 많다.
  • 파일 이 매우 크다.

  • 각 과정 번호 와 해당 하 는 수강 신청 인원 을 구하 다.
    select Cno,count(1) from sc group by Cno;
    

    3 개 이상 의 과정 을 선택 과목 으로 이수 한 학생 학 번 을 조회 하 다.
    select Sno from sc group by Sno having count(1)>3;
    

    학생 정 보 를 조회 한 결과, 학 번 전체 에 따라 질서 가 있 었 다.
    select * from student order by Sno asc;
    

    학생 정 보 를 조회 한 결과 성별 은 연령 에 따라 질서 가 있 었 다.
    select * from student order by Sex, Sage asc;
    

    모든 학생 과 그 선택 과목 의 상황 을 조회 하 다.
    select student.*,sc.Cno,sc.Grade from student inner join sc on(student.Sno=sc.Sno);
    

    학생 의 득점 상황 을 조회 하 다
    select student.Sname,course.Cname,sc.Grade
    from student inner join sc on(student.Sno=sc.Sno) inner join course on(course.Cno=sc.Cno);
    

    2 번 과정 을 선택 과목 으로 이수 하고 성적 이 90 점 이상 인 모든 학생 을 조회 합 니 다.
    select Sname from student inner join sc on(student.Sno=sc.Sno) where sc.Cno=2;
    

    모든 학생 의 정 보 를 조회 하고 성적표 에 성적 이 있 으 면 성적표 의 과정 번 호 를 출력 한다.
    select student.*,Cno from student left outer join sc on(student.Sno=sc.Sno); 
    

    - - EFT SEMI JOIN Hive 는 현재 IN / EXISTS 서브 조회 가 이 루어 지지 않 았 으 며, LEFT SEMI JOIN 으로 서브 조회 문 구 를 다시 쓸 수 있 습 니 다.
    다시 쓰기
      SELECT a.key, a.value
      FROM a
      WHERE a.key in
       (SELECT b.key
        FROM B);
    

    재 작성 한 SQL 조 회 는 다음 과 같 습 니 다.
    select a.key,a.value from a left outer join b on(a.key=b.key) where b.key is not null;
    
    select a.key,a.value from a left semi join b on(a.key=b.key)
    

    같은 학과 에서 공부 하 는 학생
    select s2.* from student as s1 inner join student as s2 on(s2.Sdept=s1.Sdept) where s1.Sname='  ';
    

    주의 비교:
    select * from student s1 left join student s2 on s1.Sdept=s2.Sdept and s2.Sname='  ';
    select * from student s1 right join student s2 on s1.Sdept=s2.Sdept and s2.Sname='  ';
    select * from student s1 inner join student s2 on s1.Sdept=s2.Sdept and s2.Sname='  ';
    select * from student s1 left semi join student s2 on s1.Sdept=s2.Sdept and s2.Sname='  ';
    select s1.Sname from student s1 right semi join student s2 on s1.Sdept=s2.Sdept and s2.Sname='  ';
    

    쓰 고 나 서도 HQL 에 대한 감각 이 좀 생 겼 어 요.잘 했 어.

    좋은 웹페이지 즐겨찾기