본문 바로가기

스파크(SPARK)

스파크 SQL 기본 코드 예제 (group by, rank)

문제 1. 부서번호가 30번인 사원들의 이름, 월급, 부서번호를 출력하시오

# sqlContext.sql 도 가능하지만 그냥 편하게 sql로 하기

scala> sql("""select ename, sal, deptno
     | from emp
     | where deptno=30""").show()
+------+----+------+
| ename| sal|deptno|
+------+----+------+
| BLAKE|2850|    30|
|MARTIN|1250|    30|
| ALLEN|1600|    30|
|TURNER|1500|    30|
| JAMES| 950|    30|
|  WARD|1250|    30|
+------+----+------+

문제 2. 직업과 직업별 토탈월급을 출력하는데 HAVING 절을 이용해서 직업별 토탈월급이 5000 이상인 것만 출력하시오

# oracle 과는 다르게  having 절에 컬럼별칭 사용해서 조건을 줄 수 있다.

scala> sql("""select job, sum(sal) as sumsal
     | from emp
     | group by job
     | having sumsal >= 5000 """ ).show()
+---------+------+
|      job|sumsal|
+---------+------+
|  ANALYST|  6000|
|      jjj|  5600|
|  MANAGER|  8275|
|PRESIDENT|  5000|
+---------+------+

 

문제 3. 이름, 월급에 대한 순위를 출력하시오

scala> sql("""select ename,sal,rank () over(order by sal desc) as rnk
     | from emp""").show()
22/09/19 16:12:12 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
+------+----+---+
| ename| sal|rnk|
+------+----+---+
|  KING|5000|  1|
|  FORD|3000|  2|
| SCOTT|3000|  2|
| JONES|2975|  4|
| BLAKE|2850|  5|
| CLARK|2450|  6|
| ALLEN|1600|  7|
|TURNER|1500|  8|
|MILLER|1300|  9|
|MARTIN|1250| 10|
|  WARD|1250| 10|
| ADAMS|1100| 12|
| JAMES| 950| 13|
| SMITH| 800| 14|
+------+----+---+

경고 메세지 나옴 

WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

위의 경고 메세지는 진짜 대용량 데이터를 조회하는 것으로 간주하고 쿼리를 수행하는 것이므로

성능을 좋게하기 위해서는 partition by 를 사용해라! 라고 권장하는 것 

 

문제 4. 부서번호, 이름, 월급, 월급에 대한 순위를 출력하는데 부서번호별로 월급이 많은 순서대로 순위를 출력해보자

scala> sql(""" select deptno,ename,sal
     | ,rank() over(partition by deptno order by sal desc) as rnk
     | from emp""" ).show()

 

+------+------+----+---+
|deptno| ename| sal|rnk|
+------+------+----+---+
|    20|  FORD|3000|  1|
|    20| SCOTT|3000|  1|
|    20| JONES|2975|  3|
|    20| ADAMS|1100|  4|
|    20| SMITH| 800|  5|
|    10|  KING|5000|  1|
|    10| CLARK|2450|  2|
|    10|MILLER|1300|  3|
|    30| BLAKE|2850|  1|
|    30| ALLEN|1600|  2|
|    30|TURNER|1500|  3|
|    30|MARTIN|1250|  4|
|    30|  WARD|1250|  4|
|    30| JAMES| 950|  6|
+------+------+----+---+