Oracle_practice3

sql developer

  • sql developer에서 새로운 sql 워크시트를 생성한다.

    도구 → sql워크시트 :

  • 오라클 SQL과 PL/SQL을 다루는 기술 92p

SELECT 사용법

  • 교재를 참고하여 코드를 익혀보자
  • SELECT문은 다음과 같이 사용한다.
1
2
3
4
5
6
7
8
9
-- SELECT
SELECT * 혹은 컬럼
FROM 테이블 또는 VIEW
WHERE 조건
ORDER BY 컬럼;

어디서 가져올 것인가? FROM
무얼을 가져올 것인가? SELECT
어떻게 가져올 것인가? WHERE

SELECT 문

  • SELECT문을 실제로 사용해본다.
1
2
3
4
5
6
7
8
9
10
-- SELECT
-- 질문 : 사원 테이블에서 급여가 5000이 넘는 사원번호와 사원명을 조회한다.
DESC employees;

SELECT
employee_id
, emp_name
, salary
FROM employees
WHERE salary > 5000;
  • 다음과 같이 출력된다.

Untitled

  • select문을 좀 더 다양하게 작성해본다.
1
2
3
4
5
6
7
8
9
10
-- 급여가 5000 이상이고 job_id가 IT_PROG 사원 조회
-- 94p
SELECT
employee_id
, emp_name
, salary
FROM employees
WHERE salary > 5000
AND job_id = 'IT_PROG'
ORDER BY employee_id;

Untitled

INSERT문, SELECT문

  • INSERT문으로 행을 삽입하고 SELECT로 출력해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- p.94
-- 급여가 5000 이상이고 job_id가 IT_PROG 사원 조회
SELECT
employee_id
, emp_name
, salary
FROM employees
WHERE salary > 5000
AND job_id = 'it_prog' -- 영어는 대소문자 구분
ORDER BY employee_id;

-- 급여가 5000 이상이거나 job_id가 'IT_PROG'인 사원 (OR)
-- 합집합
SELECT
employee_id
, emp_name
, salary
, job_id
FROM employees
WHERE salary > 5000
OR job_id = 'it_prog' -- 영어는 대소문자 구분
ORDER BY employee_id;

SELECT * FROM employees;

-- INSERT
CREATE TABLE ex3_1 (
col1 VARCHAR2(10),
col2 NUMBER,
col3 DATE
);

INSERT INTO ex3_1(col1, col2, col3)
VALUES ('ABC', 10, SYSDATE);

-- 컬럼 순서를 바꿔도 큰 문제가 안됨
INSERT INTO ex3_1(col3, col1, col2)
VALUES (SYSDATE, 'DEF', 20);

SELECT * FROM ex3_1;

-- 타입 맞추지 않음 오류 발생
INSERT INTO ex3_1(col1, col2, col3)
VALUES ('ABC', 10, 30);

-- p.97
-- 컬럼명 생략
INSERT INTO ex3_1
VALUES ('GHI', 10, SYSDATE);

INSERT INTO ex3_1 (col1, col2)
VALUES('GHI', 20);

SELECT * FROM ex3_1;

Untitled

  • 자주 사용되는 SELECT문 활용법이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- p.98
CREATE TABLE ex3_2(
emp_id NUMBER
, emp_name VARCHAR2(100)
);

-- 실무에서 많이 쓰임
INSERT INTO ex3_2(emp_id, emp_name)
SELECT
employee_id
, emp_name
FROM employees
WHERE salary > 5000;

SELECT * FROM ex3_2;

Untitled

UPDATE 문 사용법

  • UPDATE : 기존 데이터를 수정
  • ARTER : 기존 테이블의 컬럼명 수정, 제약조건
1
2
3
UPDATE 테이블명
SET 컬럼1 = 변경값1, 컬럼2 = 변경값2
WHERE 조건;

UPDATE 문

  • UPDATE 문을 실제로 사용해보자.
1
2
3
4
5
6
7
SELECT * FROM ex3_1;

-- col2 모두 50으로 변경한다.
UPDATE ex3_1
SET col2 = 50;

SELECT * FROM ex3_1;
  • col2 값이 모두 50으로 수정되었다.

Untitled

  • SELECT문으로 사람 이름을 수정해보자.
1
2
3
4
5
UPDATE ex3_2
SET EMP_NAME = 10 -- Michael Hartstein
WHERE EMP_ID = 201;

SELECT * FROM ex3_2;
  • Michael이란 이름이 10으로 변경되었다.

Untitled

MERGE

  • 조건 비교해서 테이블에 해당 조건에 맞는 데이터가 없으면 INSERT 있으면 UPDATE하는 방식이다.
1
2
3
4
5
6
7
8
9
10
MERGE INTO [스키마.]테이블명
USING (update나 insert될 데이터 원천)
ON (update될 조건)
WHEN MATCHED THEN
SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE update 조건
DELETE WHERE update_delete 조건
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2, ...) VALUES (값1, 값2,...)
WHERE insert 조건;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- MERGE
-- 조건 비교해서 테이블에 해당 조건에 맞는 데이터가 없으면 INSERT
-- 있으면 UPDATE

CREATE TABLE ex3_3(
employee_id NUMBER
, bonum_amt NUMBER DEFAULT 0
);

SELECT * FROM SALES;
DESC SALES;

-- ex3_3 신규테이블 생성
INSERT INTO ex3_3(employee_id)
SELECT
e.employee_id
FROM employees e, sales s
WHERE e.employee_id = s.employee_id
AND s.SALES_MONTH BETWEEN '200010' AND '200012'
GROUP BY e.employee_id;
-- group by를 통해 중복 제거

SELECT * FROM ex3_3 ORDER BY employee_id;

Untitled

서브쿼리

  • 쿼리 안에 또 다른 쿼리가 있는 형태이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- (1) 관리자 사번(manager_id)이 146번인 사원을 찾는다.
-- (2) ex3_3 테이블에 있는 사원의 사번과 일치하면
-- 보너스 금액에 자신의 급여의 1%를 보너스로 갱신
-- (3) ex3_3 테이블에 있는 사원의 사번과 일치하지 않으면
-- (1)의 결과의 사원을 신규로 입력 (이 때 보너스 금액은 급여의 0.1%
-- (4) 이 때 급여가 8000미만인 사원만 처리해보자.

-- 서브쿼리
SELECT
employee_id
, manager_id
, salary
, salary * 0.01 -- 10%
FROM employees
WHERE employee_id IN (SELECT employee_id FROM ex3_3);

Untitled

  • 서브쿼리의 또 다른 예시이다.
1
2
3
4
5
6
7
8
9
10
11
-- 관리자 사번이 146번인 사원은 161번 사원 한 명이므로
-- ex3_3 테이블에서 161인 건의 보너스 금액은 7,000 * 0.01, 즉 70으로 갱신

SELECT
employee_id
, manager_id
, salary
, salary * 0.01 -- 10%
FROM employees
WHERE employee_id NOT IN (SELECT employee_id FROM ex3_3)
AND manager_id = 146;

Untitled

MERGE 문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MERGE INTO ex3_3 d 
USING (SELECT
employee_id
, salary
, manager_id
FROM employees
WHERE manager_id = 146) b
ON (d.employee_id = b.employee_id)
WHEN MATCHED THEN
UPDATE SET d.bonus_amt = d.bonus_amt + b.salary * 0.01
WHEN NOT MATCHED THEN
INSERT (d.employee_id, d.bonus_amt) VALUES (b.employee_id, b.salary * 0.001)
WHERE (b.salary < 8000);

SELECT * FROM ex3_3 ORDER BY employee_id;
  • 오타 처리하다 3번 실행한 결과이다.

Untitled

DELETE 문

  • UPDATE에 비해 간단하다.
  • 삭제하기만 하면 되기 때문.
1
2
3
4
-- DELETE 문
-- 106p
DELETE ex3_3;
SELECT * FROM ex3_3;

COMMIT, ROLLBACK

  • commit과 rollback을 사용해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
-- Commit Rollback Truncate
-- Commit : 변경한 데이터를 DB에 마지막으로 반영
-- ROLLBACK : 반대로 변경한 데이터를 변경하기 이전 상태로 되돌림
CREATE TABLE ex3_4 (
employee_id NUMBER
);

INSERT INTO ex3_4 VALUES (100);

SELECT * FROM ex3_4;

commit;
rollback;

Untitled

  • commit 후에는, sqlplus에서도 테이블을 출력 할 수 있게 된다.

Untitled

TRUNCATE문

  • 한번 실행 시, 데이터 바로 삭제한다.
  • ROLLBACK 적용 안됨
1
2
3
4
5
6
-- TRUNCATE 문
-- 한번 실행시, 데이터 바로 삭제, ROLLBACK 적용 안됨
-- DELETE문은 데이터 삭제 후, COMMIT 필요 / ROLLBACK 데이터가 삭제되기 전의 복구 불가

SELECT * FROM ex3_4;
TRUNCATE TABLE ex3_4;

Untitled

  • Reference : 오라클 SQL과 PL/SQL을 다루는 기술

Oracle_practice2

sql developer

  • sql developer에서 새로운 sql 워크시트를 생성한다.
    • 도구 → sql 워크시트 : ch02_0426
  • 오라클 SQL과 PL/SQL을 다루는 기술 60p

실습

  • 교재를 참고하여 코드를 익혀보자
  • 제약조건을 작성해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 60P
-- not null
-- 제약 조건
CREATE TABLE ex2_6(
COL_NULL VARCHAR2(10)
, COL_NOT_NULL VARCHAR2(10) NOT NULL
);

INSERT INTO ex2_6 VALUES ('AA', '');
INSERT INTO ex2_6 VALUES ('AA', 'BB');

SELECT * FROM ex2_6;

-- USER CONSTRAINTS 제약 조건 확인
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_6';

  • SELECT 문을 사용하여 제약 조건을 출력.

Untitled

  • 이어서 실습한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

-- UNIQUE
-- 중복값 허용 안 함
CREATE TABLE ex2_7 (
COL_UNIQUE_NULL VARCHAR2(10) UNIQUE
, COL_UNIQUE_NULL VARCHAR2(10) UNIQUE NOT NULL
, COL_UNIQUE VARCHAR(10)
, CONSTRAINTS unique_nm1 UNIQUE (COL_UNIQUE)
);

SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_7';

SELECT * FROM ex2_7;

INSERT INTO ex2_7 VALUEs('AA', 'AA', 'AA');
SELECT * FROM ex2_7;

INSERT INTO ex2_7 VALUES('AA', 'AA', 'AA');
SELECT * FROM ex2_7;

INSERT INTO ex2_7 VALUES('', 'BB', 'BB');
INSERT INTO ex2_7 VALUES('', 'CC', 'CC');
SELECT * FROM ex2_7;

-- 기본키 ( 63P)
CREATE TABLE ex2_8(
COL VARCHAR2(10) PRIMARY KEY
, COL2 VARCHAR2(10)
);

SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_8';

INSERT INTO ex2_8 VALUES('','AA');
-- 오류 보고 ORA-01400: NULL을 ("ORA_USER"."EX2_8"."COL") 안에 삽입할 수 없습니다
-- NULL 값을 삽입하여 생기는 오류이다. NULL값 대신 다른 값을 입력하자.
  • 여기까지 입력하고 실행하면 오류가 발생한다.

— 오류 보고 ORA-01400: NULL을 (“ORA_USER”.”EX2_8”.”COL”) 안에 삽입할 수 없습니다

Untitled

  • NULL 값을 삽입하여 생기는 오류이다. NULL값 대신 다른 값을 입력하자.
1
2
3
4
-- 오류 보고 ORA-01400: NULL을 ("ORA_USER"."EX2_8"."COL") 안에 삽입할 수 없습니다
-- NULL 값을 삽입하여 생기는 오류이다. NULL값 대신 다른 값을 입력하자.
INSERT INTO ex2_8 VALUES('AA','AA');
SELECT * FROM ex2_8;
  • 이번에는 오류가 출력되지 않았다.

Untitled

  • 같은 값을 다시 입력해보자.
1
2
3
4
INSERT INTO ex2_8 VALUES('AA','AA');
-- ORA-00001: 무결성 제약 조건(ORA_USER.SYS_C007484)에 위배됩니다
-- 값이 같은 데이터를 입력하여 생기는 오류이다. 다른 데이터를 입력해야 한다.

  • 오류가 발생했다.

– ORA-00001: 무결성 제약 조건(ORA_USER.SYS_C007484)에 위배됩니다

  • 값이 같은 데이터를 입력하여 생기는 오류이다. 다른 데이터를 입력하면 해결된다.

Untitled

테이블 생성과 제약조건

  • 90p의 테이블을 생성해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
-- 90p 테이블 1, 2, 3번 생성
CREATE TABLE ORDERS (
ORDER_ID NUMBER(12, 0)
, ORDER_DATE DATE
, ORDER_MODE VARCHAR2(8 BYTE)
, CUSTOMER_ID NUMBER(6, 0)
, ORDER_STATUS NUMBER(2, 0)
, ORDER_TOTAL NUMBER(8, 2) DEFAULT 0
, SALES_REP_ID NUMBER(6, 0)
, PROMOTION_ID NUMBER(6, 0)
, CONSTRAINT PK_ORDER PRIMARY KEY (ORDER_ID)
, CONSTRAINT CK_ORDER_MODE CHECK (ORDER_MODE in ('direct', 'online'))
);

CREATE TABLE ORDER_ITEMS (
ORDER_ID NUMBER(12,0),
LINE_ITEM_ID NUMBER(3,0) ,
ORDER_MODE VARCHAR2(8 BYTE),
PRODUCT_ID NUMBER(3,0),
UNIT_PRICE NUMBER(8,2) DEFAULT 0,
QUANTITY NUMBER(8,0) DEFAULT 0,
CONSTRAINT PK_ORDER_ITEMS PRIMARY KEY (ORDER_ID, LINE_ITEM_ID)
);

CREATE TABLE PROMOTIONS (
PROMO_ID NUMBER(12,0),
PROMO_NAME VARCHAR2(8 BYTE),
CONSTRAINT PK_PROMOTIONS PRIMARY KEY (PROMO_ID)
);

-- CHECK
CREATE TABLE ex2_9 (
num1 NUMBER
CONSTRAINTS check1 CHECK ( num1 BETWEEN 1 AND 9),
gender VARCHAR2(10)
CONSTRAINTS check2 CHECK ( gender IN ('MALE', 'FEMALE'))
);

SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_9';

INSERT INTO ex2_9 VALUES (10, 'MAN');
INSERT INTO ex2_9 VALUES (5, 'FEMALE');

테이블 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- DEFAULT 
-- PL/SQL 사용하면 편하게 해결 가능
DROP TABLE ex2_10;

CREATE TABLE ex2_10 (
Col1 VARCHAR2(10) NOT NULL,
Col2 VARCHAR2(10) NULL,
Create_date DATE DEFAULT SYSDATE
);

-- Col1 Col2 사용자가 입력
-- Create_Date DB에서 자동으로 입력
INSERT INTO ex2_10 (col1, col2) VALUES ('AA', 'BB');
SELECT * FROM ex2_10;
  • 여기까지 작성하고 실행하면 다음과 같이 출력된다.

Untitled

테이블 변경

  • 이번엔 테이블을 여러 명령어를 통해 다뤄보자
1
2
3
4
5
6
7
8
9
10
11
12
13

-- 테이블 변경
-- 69p (1) 컬럼명 변경

ALTER TABLE ex2_10 RENAME COLUMN Col1 TO Col11;
SELECT * FROM ex2_10;

DESC ex2_10;

-- (2) 컬럼 타입 변경
-- 컬럼 타입 변경 (VARCHAR2(10) ~ VARCHAR2(30))으로 변경
ALTER TABLE ex2_10 MODIFY Col2 VARCHAR2(30);
DESC ex2_10;
  • 테이블이 변경된다.

Untitled

  • 이번엔 생성하거나 삭제해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- (3) col3 NUMBER 타입으로 신규 생성
ALTER TABLE ex2_10 ADD Col3 NUMBER;
DESC ex2_10;

-- (4) 컬럼삭제
ALTER TABLE ex2_10 DROP COLUMN Col3;
DESC ex2_10;

-- 제약조건 추가
ALTER TABLE ex2_10 ADD CONSTRAINTS pk_ex2_10 PRIMARY KEY (col11);

-- USER CONSTRAINTS 제약 조건 확인
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_10';
  • 제약조건이 추가되었다.

Untitled

  • 제약조건을 삭제해보자.
1
2
3
4
5
6
7
-- 제약조건 삭제
ALTER TABLE ex2_10 DROP CONSTRAINTS pk_ex2_10;

-- USER CONSTRAINTS 제약 조건 확인
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_10';
  • 이전에 추가한 제약조건이 삭제되었다.

Untitled

뷰(view)

  • emp_dept_v1 뷰를 생성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
a.employee_id
, a.emp_name
, a.department_id -- 부서명 컬럼
, b.department_name
FROM
employees a
, departments b
WHERE a.department_id = b.department_id;

CREATE OR REPLACE VIEW emp_dept_v1 AS
SELECT
a.employee_id
, a.emp_name
, a.department_id
, b.department_name
FROM
employees a
, departments b
WHERE a.department_id = b.department_id;
  • 새로운 view가 생성된다.

Untitled

인덱스(index)

  • 인덱스를 생성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 인덱스 생성
-- 75p
-- 추후 공부해야 할 내용 : 인텍스 내부 구조에 따른 분류
---- (초중급 레벨) B-Tree 인덱스, 비트맵 인덱스, 함수 기반 인덱스
---- DB 성능
-- 인덱스 생성
-- col11 값에 중복 값을 허용하지 않는다.
-- 인덱스 생성 시, user_indexes 시스템 뷰에서 내역 확인
CREATE UNIQUE INDEX ex2_10_ix011
ON ex2_10(col11);

SELECT index_name, index_type, table_name, uniqueness
FROM user_indexes
WHERE table_name = 'EX2_10';
  • 실제로 인덱스가 생성되었다는 안내문이 출력된다.

Untitled

  • Reference : 오라클 SQL과 PL/SQL을 다루는 기술

Oracle_practice1

사전준비

실습

  • SQL Developer 에서 실행
  • 테이블을 생성한다.
    • 다음 코드를 작성해보자
1
2
3
4
5
6
CREATE TABLE ex2_1 (
COLUMN1 CHAR(10)
, COLUMN2 VARCHAR2(10)
, COLUMN3 NVARCHAR2(10)
, COLUMN4 NUMBER
);
  • 저장(ctrl + s) 후 실행(ctrl + enter)
    • 다음과 같이 테이블과 컬럼이 생성된다.

Untitled

  • 오라클 SQL과 PL/SQL을 다루는 기술 52p
  • 교재를 따라 다음과 같이 작성하고 실행해 본다.
    • 스크립트 실행 = 전체 실행 = F5
    • 명령문 실행 = 일부 실행 = ctrl + enter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

CREATE TABLE ex2_1 (
COLUMN1 CHAR(10)
, COLUMN2 VARCHAR2(10)
, COLUMN3 NVARCHAR2(10)
, COLUMN4 NUMBER
);

-- 데이터 추가
INSERT INTO ex2_1 (COLUMN1, COLUMN2) VALUES('abc', 'abc')

-- 데이터 확인
SELECT
COLUMN1
, LENGTH(COLUMN1) as len1
, COLUMN2
, LENGTH(COLUMN2) as len2
FROM ex2_1;

-- 새로운 테이블 생성
CREATE TABLE ex2_2(
COLUMN1 VARCHAR2(3)
, COLUMN2 VARCHAR2(3 byte)
, COLUMN3 VARCHAR2(3 char)
);

-- 데이터 추가
INSERT INTO ex2_2 VALUES('abc', 'abc', 'abc');

-- 조회
SELECT
COLUMN1
, LENGTH(COLUMN1) As len1
, COLUMN2
, LENGTH(COLUMN2) As len2
, COLUMN3
, LENGTH(COLUMN3) As len3
FROM ex2_2;

-- 한글 데이터 삽입
-- 에러 발생
INSERT INTO ex2_2 VALUES('홍길동', '홍길동', '홍길동');

- 데이터 조회
SELECT
COLUMN3
, LENGTH(COLUMN3) As len3
, LENGTHB(COLUMN3) As bytelen
FROM ex2_2;

- 숫자 데이터 삽입
CREATE TABLE ex2_3(
COL_INT INTEGER
, COL_DEC DECIMAL
, COL_NUM NUMBER
);

SELECT
column_id
, column_name
, data_type
, data_length
FROM user_tab_cols
WHERE table_name = 'EX2_3'
ORDER BY column_id;

-- p57
CREATE TABLE ex2_4 (
COL_FLOT1 FLOAT(32),
COL_FLOT2 FLOAT
);

INSERT INTO ex2_4 (col_flot1, col_flot2) VALUES (1234567891234, 1234567891234);

-- 조회
SELECT * FROM ex2_4;

-- p.58
CREATE TABLE ex2_5(
COL_DATE DATE
, COL_TIMESTAMP TIMESTAMP
);
INSERT INTO ex2_5 VALUES (SYSDATE, SYSTIMESTAMP);
SELECT * FROM ex2_5;

-- LOB 데이터 타입
-- Large object의 약자로 대용량 데이터 저장할 수 있는 데이터 타입
-- 비정형 데이터는 그 크기가 매우 큰데, 이런 데이터를 저장한다.

Oracle_setting

사전준비

  • 오라클을 설치한다.

구글링 : oracle database 19c download

Oracle Database 19c Download for Microsoft Windows x64 (64-bit) | Oracle 대한민국

Untitled

  • SQL Developer 설치한다.

구글링 : sql developer

Oracle SQL Developer Downloads

Untitled

  • c 드라이브 경로에 폴더 생성 : sql_lecture

앞서 다운로드한 설치 파일을 sql_lecture 폴더에 정리한다.

  • 압축 해제한다.

우클릭 후에 “extract WINDOWS.X64\”

  • 관리자 권한으로 실행 : setup
  • 다음 경로로 이동하여 실행하면 된다.

c 드라이브 → sql_lecture 폴더 → WINDOWS.X64_193000_db_home 폴더 → setup

Untitled

  • 체크 : 단일 인스턴스 데이터베이스 생성 및 구성

Untitled

  • 체크 : 데스크톱 클래스

Untitled

  • 체크 : 가상 계정 사용

Untitled

  • 오라클 SQL과 PL/SQL을 다루는 기술 22p 참고하여 설정한다.
  • 전역 데이터베이스 이름 : myoracle
  • 비밀번호 : 1234
  • 체크 해제 : 컨테이너 베이스로 생성

Untitled

  • 설치까지 진행한다.
  • 설치 완료

Untitled

1단계 sqlplus 실행하기

  • 관리자 권한으로 실행 : SQL Plus

Untitled

  • 정보를 입력한다.

→사용자명 : system

→비밀번호 : 1234

Untitled

2단계 : 테이블 스페이스 생성하기

  • 오라클 SQL과 PL/SQL을 다루는 기술 27p 참고
  • 다음 코드를 사용하여 테이블 스페이스를 생성한다.
    • 테이블 스페이스는 myts라 명명하고 100MB 크기로 생성
    • 만약 데이터가 증가하면 5MB씩 자동 증가 옵션 추가

CREATE TABLESPACE myts DATAFILE 'C:\sql_lecture\oradata\MYORACLE\myts.dbf' SIZE 100M AUTOEXTEND ON NEXT 5M;

Untitled

3단계 : 사용자 생성

  • 해당 사용자에게 롤(Role, 권한)을 부여해야 한다. 현 시점에서는 ‘ora_user’ 사용자에게 DBA라는 롤을 부여한다.

    • 이 권한을 부여받으면 오라클에서 제공하는 웬만한 기능을 모두 사용한다.
  • 사용자를 생성하는 코드를 작성한다.

(패스워드를 evan으로 할 경우, 다음과 같이 작성)

CREATE USER ora_user IDENTIFIED BY evan DEFAULT TABLESPACE MYTS TEMPORARY TABLESPACE TEMP;

Untitled

4단계 : 사용자 계정으로 DB에 접속하기

  • ora_user로 접속한다.

GRANT DBA TO ora_user;

connect ora_user/evan;

  • 접속 후, show user; 입력하면 현재 로그인한 사용자 이름이 출력된다.

show user;

Untitled

SQL Developer 실행

  • 새 접속 화면이 나타나면 접속 이름, 사용자 이름을 ora_user로 입력, 비밀번호는 입력, SID 항목에는 처음 설치 시 이름인 myoracle을 입력하고 테스트를 실행한다.

  • 압축 해제한다.

우클릭 후에 “extract sqldeveloper214.3…”

  • 관리자 권한으로 실행 : sqldeveloper
  • 다음 경로로 이동하여 실행하면 된다.

c 드라이브 → sql_lecture 폴더 → sqldeveloper-21.4.3.063.0100-x64 폴더

→ sqldeveloper 폴더 → sqldeveloper

  • 만약 다음 확인 창이 출력되면 ‘아니오’ 선택한다.

Untitled

  • Oracle 접속을 새로 만든다.

우클릭 : Oracle 접속 → 새 접속

Untitled

  • 다음과 같이 설정하고 ‘테스트’
    • 사용자 이름 : ora_user
    • 비밀번호 : evan
  • 상태 : 성공
  • 성공했다면 ‘접속’

Untitled

  • 다음과 같이 출력된다.

Untitled

환경설정

  • 다음 환결설정에서 인코딩을 UTF-8로 변경한다.
    • 메뉴 바 → 도구 → 환경 설정 → 환경 → 인코딩 : UTF-8

Untitled

SQL Developer 날짜 기록

  • 다음 경로로 [NLS] 항목을 선택한다.
    • 메뉴 바 → 도구 → 환경 설정 → 데이터 베이스 → NLS
  • NLS에서 ‘시간 기록 형식’을 수정.
    • 다음과 같이 수정한다.
    • 시간 기록 형식 : YYYY/MM/DD HH24:MI:SS

Untitled

샘플 스키마 설치

Untitled

  • 관리자 권한으로 실행 : 명령 프롬프트
  • C:\backup 경로로 이동한다.
  • 다음 코드 실행 : expall.dmp 을 올린다.

imp ora_user/evan file=expall.dmp log=empall.log ignore=y grants=y rows=y indexes=y full=y

  • 다음 코드 실행 : expcust.dmp 을 올린다.

imp ora_user/evan file=expcust.dmp log=expcust.log ignore=y grants=y rows=y indexes=y full=y

Untitled

  • 임포트가 정상 종료되었다면 Oracle SQL로 이동하여 작업
  • 다음 코드를 작성

SELECT table_name FROM user_tables;

→ 실행 : ctrl + enter

→ 다음과 같이 출력되면 성공.

Untitled

  • Git 연동

SQL Developer with Git - Data Science | DSChloe

Oracle 실습01

Oracle 실습02

Oracle 실습03

Oracle 실습04

Oracle 실습05

Oracle 실습06

Oracle on Jupyter Lab

Crawling_practice

  • 웹 크롤링을 시도해본다.
  • 우선 Pycharm 환경에서 가상환경을 생성해야 한다.

바탕화면에 crawling 폴더 생성

→ 우클릭하여 pycharm으로 열기

→ File → Settings

→ Project : crawling → python interpreter

→ 톱니모양 → add

Untitled

  • 필요한 패키지들을 설치한다.

→ git bash 터미널

pip install beautifulsoup4

pip install numpy pandas matplotlib seaborn

pip install requests

  • 브라우저에서 검색을 진행

→ 검색 : 확진자수

→ 우클릭 → 검사

Untitled

  • 원하는 정보가 포함된 코드를 선택 가능

Untitled

  • index.html을 생성한다.

crawling 폴더 우클릭 → New → HTML.file

Untitled

  • 다음과 같이 입력하고 index 파일을 열어본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<titl>test</titl>
</head>
<body>
<h1>aaaaaaaa</h1>
<h2>dddd</h2>
<div class="chapter01">
<p>Don't Crawl here </p>
</div>
<div class="chapter02">
<p>Just Crawling here</p>
</div>
</body>
</html>
  • index 파일을 열면 index.html에 작성한 대로 출력된다.

Untitled

  • 이번에는 다른 파일에 코드를 작성해보자.
    • 일단 main.py에 작성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
from bs4 import BeautifulSoup

# 첫 번째 작업 index.html 파일을 BeautifulSoup 객체로 변환
## 클래스 변환 --> 클래스 내부의 메서드 사용

# html 파일을 변환
soup = BeautifulSoup(open("index.html", encoding='UTF-8'), "html.parser")
# print(type(soup))

# print(soup.find("div", class_="chapter02"))
# print(soup.find("p"))
results = soup.find_all("p")
print(results[1])
  • Index.html에서 크롤링하여 다음과 같이 출력된다.

python main.py

Untitled

Untitled

  • 정렬 : ctrl + alt + l

Python

웹상에 있는 데이터를 숩집하는 도구

  • BeautifulSoup 가장 일반적인 수집 도구 (CSS 통해서 수집)
  • Scrapy (CSS, XAPTH 통해서 데이터 수집 + JavaScript)
  • Selenium (CSS, XPATH 통해서 데이터 수집 + JAVAScript)

—> 자바 필요 + 여러가지 설치 도구 필요

웹 사이트 만드는 3대 조건 + 1

  • HTML, CSS, JavaScript, Ajax (비동기처리)

웹 사이트 구동 방식

Crawling 실습

Crawling_setting

  • 웹 크롤링을 시도해본다.
  • 우선 Pycharm 환경에서 가상환경을 생성해야 한다.

바탕화면에 crawling 폴더 생성

→ 우클릭하여 pycharm으로 열기

→ File → Settings

→ Project : crawling → python interpreter

→ 톱니모양 → add

Untitled

  • 필요한 패키지들을 설치한다.

→ git bash 터미널

pip install beautifulsoup4

pip install numpy pandas matplotlib seaborn

pip install requests

  • 브라우저에서 검색을 진행

→ 검색 : 확진자수

→ 우클릭 → 검사

Untitled

  • 원하는 정보가 포함된 코드를 선택 가능

Untitled

  • index.html을 생성한다.

crawling 폴더 우클릭 → New → HTML.file

Untitled

  • 다음과 같이 입력하고 index 파일을 열어본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<titl>test</titl>
</head>
<body>
<h1>aaaaaaaa</h1>
<h2>dddd</h2>
<div class="chapter01">
<p>Don't Crawl here </p>
</div>
<div class="chapter02">
<p>Just Crawling here</p>
</div>
</body>
</html>
  • index 파일을 열면 index.html에 작성한 대로 출력된다.

Untitled

  • 이번에는 다른 파일에 코드를 작성해보자.
    • 일단 main.py에 작성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
from bs4 import BeautifulSoup

# 첫 번째 작업 index.html 파일을 BeautifulSoup 객체로 변환
## 클래스 변환 --> 클래스 내부의 메서드 사용

# html 파일을 변환
soup = BeautifulSoup(open("index.html", encoding='UTF-8'), "html.parser")
# print(type(soup))

# print(soup.find("div", class_="chapter02"))
# print(soup.find("p"))
results = soup.find_all("p")
print(results[1])
  • Index.html에서 크롤링하여 다음과 같이 출력된다.

python main.py

Untitled

Untitled

  • 정렬 : ctrl + alt + l

Python

웹상에 있는 데이터를 숩집하는 도구

  • BeautifulSoup 가장 일반적인 수집 도구 (CSS 통해서 수집)
  • Scrapy (CSS, XAPTH 통해서 데이터 수집 + JavaScript)
  • Selenium (CSS, XPATH 통해서 데이터 수집 + JAVAScript)

—> 자바 필요 + 여러가지 설치 도구 필요

웹 사이트 만드는 3대 조건 + 1

  • HTML, CSS, JavaScript, Ajax (비동기처리)

웹 사이트 구동 방식

Crawling 실습

Spark ML

  • Spark로 머신러닝을 사용해 본다.
  • 실용성과 별개로 경험삼아 작성해보는 코드이다.
  • 머신러닝(ML)은 Scikit-Learn을 중점적으로 공부해야 한다.
  • 딥러닝(DL)은 Tensorflow, Pytorch에 포커스를 맞춰야 한다.

사전준비

  • git bash로 VSCord에 들어가 터밀널을 연다.

바탕화면 우클릭 : git bash here

cd pyspk_project

code .

→ git bash 터미널

pyspark_ml 실습(1)

  • 가상환경 진입하고 폴더, 파일 생성

source venv/Scripts/activate

→ 폴더 생성 : chapter03_ml

cd chapter03_ml

  • 슬랙에서 data.zip 을 다운로드
  • 압축을 풀고 chapter03_ml 폴더에 복사하여 옮긴다.

→ 파일 생성 : step01_regression.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from pyspark.ml.regression import DecisionTreeRegressor
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler

# 세션 할당
spark = SparkSession.builder.appName("DecisionTree").getOrCreate()

# 데이터 불러오기
# StructType 이 과정 생략
data = spark.read.option("header", "true").option("inferSchema", "true").csv("data/realestate.csv")

# 데이터 프레임을 행렬로 변환
assembler = VectorAssembler().setInputCols(['HouseAge', 'DistanceToMRT', 'NumberConvenienceStores']).setOutputCol("features")

# 타겟데이터 설정
df = assembler.transform(data).select("PriceofUnitArea", "features")

# 데이터 분리
trainTest = df.randomSplit([0.5, 0.5])
trainingDF = trainTest[0]
testDF = trainTest[1]

# Decision Tree 클래스 정의
dtr = DecisionTreeRegressor().setFeaturesCol("features").setLabelCol("PriceofUnitArea")

# 모델 학습
model = dtr.fit(trainingDF)
print(model)

# 모델 예측
fullPredictions = model.transform(testDF).cache()

# 예측값과 Label을 분리
predictions = fullPredictions.select("prediction").rdd.map(lambda x: x[0])

# 실제데이터
labels = fullPredictions.select("PriceofUnitArea").rdd.map(lambda x: x[0])

# zip
preds_label = predictions.zip(labels).collect()

for prediction in preds_label:
print(prediction)

# print(data.show())

# 세션 종료
spark.stop()

→ 저장 후 실행

python step01_regression.py

→ 다음과 같이 출력된다.

Untitled

pyspark_ml 실습(2)

→ 파일 생성 : step02_logistic_regression.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 세션 할당
from pyspark.sql import SparkSession
from pyspark.ml.classification import LogisticRegression # 기억

spark = SparkSession.builder.appName("AppName").getOrCreate()

# 데이터 불러오기
training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")
print("hello")

# 모델 만들기
# Scikit-Learn 문법과 비슷
mlr = LogisticRegression() # 기억
mlr_model = mlr.fit(training) # 기억

# 로지스틱 회귀, 선형 모델.. 기울기와 상수
print("Coefficients: " + str(mlr_model.coefficients))
print("Intercept: " + str(mlr_model.intercept))

spark.stop()

→ 저장 후 실행

python step02_logistic_regression.py

pyspark_ml 실습(3)

  • pyspark_pipeline

→ 파일 생성 : step03_pipeline.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from tokenize import Token
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF, Tokenizer

from pyspark.sql import SparkSession

# 세션 할당
spark = SparkSession.builder.appName("MLPipeline").getOrCreate()

# 가상의 데이터 만들기
training = spark.createDataFrame([
(0, "a b c d e spark", 1.0),
(1, "b d", 0.0),
(2, "spark f g h", 1.0),
(3, "hadoop mapreduce", 0.0)
], ["id", "text", "label"])

# Feature Engineering
# 요리 작업

# 요리준비 1단계 : 텍스트를 단어로 분리
tokenizer = Tokenizer(inputCol='text', outputCol='words')

# 요리준비 2단계 : 변환된 텍스트를 숫자로 변환
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")

# 요리준비 3단계 : 모델을 가져옴
lr = LogisticRegression(maxIter=5, regParam=0.01)

# 요리 시작
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

# 메인재료 투하
model = pipeline.fit(training)

# Prepare test documents, which are unlabeled (id, text) tuples.
test = spark.createDataFrame([
(4, "spark i j k"),
(5, "l m n"),
(6, "spark hadoop spark"),
(7, "apache hadoop")
], ["id", "text"])

# 예측
prediction = model.transform(test)
selected = prediction.select("id", "text", "probability", "prediction")
for row in selected.collect():
row_id, text, prob, prediction = row # 튜플
print(
# 문자열 포맷팅
"(%d, %s) -------> probability=%s, prediction=%f" % (row_id, text, str(prob), prediction)
)

# training.show()

# 세션 종료
spark.stop()

→ 저장 후 실행

python step03_pipeline.py

Untitled

pyspark_ml 실습(3)

→ 파일 생성 : step03_randomforest.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from cProfile import label
from pyspark.sql import SparkSession

# 머신러닝 라이브러리
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import IndexToString, StringIndexer, VectorIndexer
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# 데이터 불러오기
spark = SparkSession.builder.appName("RandomForest").getOrCreate()

data = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")
print(type(data))

# Feature Engineering
# label column
labelIndexer = StringIndexer(inputCol='label', outputCol='indexedLabel').fit(data)

# 범주형 데이터 체크, 인덱스화
featureIndexer = VectorIndexer(inputCol='features',
outputCol='IndexedFeatures', maxCategories=4).fit(data)

# 데이터 분리
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# 모델
rf = RandomForestClassifier(labelCol='indexedLabel', # 종속변수
featuresCol='IndexedFeatures', # 독립변수
numTrees=10)

# outputCol='indexedLabel' --> original label로 변환
labelConvereter = IndexToString(inputCol='prediction',
outputCol='predictedLabel', labels=labelIndexer.labels)

# 파이프라인 구축
pipeline = Pipeline(stages=[labelIndexer, featureIndexer, rf, labelConvereter])

# 모델 학습
model = pipeline.fit(trainingData)

# 모델 예측
predictions = model.transform(testData)

# 행에 표시할 것 추출
predictions.select("predictedLabel", 'label', 'features').show(5)

# 모형 평가
evaluator = MulticlassClassificationEvaluator(
labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy"
)

accuracy = evaluator.evaluate(predictions)
print("Test Error = %f " % (1.0 - accuracy))

spark.stop()

→ 저장 후 실행

python step04_randomforest.py

Untitled

venv 생성되어 있는 경로로 이동

→ pip install jupyterlab

→ jupyter lab

→ 주피터랩에서 블로그에 올릴 자료 작성 가능.

Spark UI

  • 가상환경을 생성한다.

/mnt/c 경로에서 실행

mkdir temp

cd temp

virtualenv venv

Untitled

  • 가상환경에서 pyspark를 설치한다.

source venv/bin/activate

pip install pyspark

  • 다음 링크 접속

Quick Start - Spark 3.2.1 Documentation (apache.org)

  • 다음 내용을 복사한다.

Untitled

1
2
3
This program just counts the number of lines containing 'a' and the number containing 'b' in a text file. Note that you'll need to replace YOUR_SPARK_HOME with the location where Spark is installed. As with the Scala and Java examples, we use a SparkSession to create Datasets. For applications that use custom classes or third-party libraries, we can also add code dependencies to spark-submit through its --py-files argument by packaging them into a .zip file (see spark-submit --help for details). SimpleApp is simple enough that we do not need to specify any code dependencies.

We can run this application using the bin/spark-submit script:

mkdir data

cd data

ls

vi README.md

→ 위에서 복사한 내용을 붙여넣는다.

:wq

→ 내용 확인cat README.md

cd ..

vi SimpleApp.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyspark.sql import SparkSession

logFile = "data/README.md" # Should be some file on your system
spark = SparkSession.builder.appName("SimpleApp").getOrCreate()
logData = spark.read.text(logFile).cache()

numAs = logData.filter(logData.value.contains('a')).count()
numBs = logData.filter(logData.value.contains('b')).count()

print("Lines with a: %i, lines with b: %i" % (numAs, numBs))

input("Typing....")

spark.stop()

→ 저장 후 실행

→ python3 SimpleApp.py

→ 경로 확인 : echo $SPARK_HOME

$SPARK_HOME/bin/spark-submit --master local[4] SimpleApp.py

Untitled

  • 코드 샐행 후
  • 위 결과 참고하여 address 복사

→ 뒤에 :4041을 추가하여 주소창에 입력한다.

(코드 실행 후 나오는 텍스트에서 SparkUI를 확인하자)

→ 주소창에 입력하여 접속 : http://172.19.91.118:4041

→ 다음 화면 출력 시 성공.

Untitled

Spark on Linux

WSL2에서의 Spark 설치 - Data Science | DSChloe

개요

  • 간단하게 PySpark를 설치해보는 과정을 작성한다.
  • WSL2 설치 방법은 다루지 않는다.

필수 파일 설치

  • 설치가 안 되었을 경우에 설치한다.
  • 자바 및 Spark 파일을 설치하도록 한다.
1
2
3
$ sudo apt-get install openjdk-8-jdk
$ sudo wget https://archive.apache.org/dist/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz
$ sudo tar -xvzf spark-3.2.0-bin-hadoop3.2.tgz

.bashrc 파일 수정

  • 경로를 다음과 같이 설정한다.
1
2
evan@evan:/mnt/c/hadoop$ pwd
/mnt/c/hadoop
  • 설치한 파일은 다음과 같다.
1
2
evan@evan:/mnt/c/hadoop$ ls
spark-3.2.0-bin-hadoop3.2 spark-3.2.0-bin-hadoop3.2.tgz
  • vi ~/.bashrc 파일을 열고 다음과 같이 코드를 작성한다.
    • 다른 코드는 건드리지 않는다.
    • 마지막 라인에서 작성한다.
1
2
3
4
5
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export SPARK_HOME=/mnt/c/spark
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK_PYTHON=/usr/bin/python3

Untitled

테스트

  • pyspark를 실행한다. (경로에 주의한다)
  • SPARK_HOME을 다음과 같이 설정했으니 해당 경로에서 실행.
  • export SPARK_HOME=/mnt/c/spark

경로 이동 : cd ..

cd spark/

source ~/.bashrc

pyspark

Untitled

  • 정상적으로 작동한지 테스트한다.
  • 해당 경로에 README.md 파일이 있다면 시행해보자.

rd = sc.textFile("README.md")

rd.count()

→ 다음과 같이 출력된다면 성공이다.

Untitled

pyspark 실습03

사전준비

  • git bash로 VSCord에 들어가 터밀널을 연다.

바탕화면 우클릭 : git bash here

cd pyspk_project

code .

→ git bash 터미널

pyspark 실습(1)

  • 가상환경 진입하고 폴더, 파일 생성

source venv/Scripts/activate

→ 폴더 생성 : chapter02_get_cleansing

  • 슬랙에서 data.zip 을 다운로드
  • 압축을 풀고 chapter02_get_cleansing 파일에 복사하여 옮긴다.

→ 파일 생성 : pipeline.py

Untitled

  • 코드를 작성해본다.

→ 코드 작성

from pyspark.sql import SparkSession

from pyspark.sql.functions import *

print("Hello!")

→ 저장

→ 경로 이동 : cd chapter02_get_cleansing

→ 실행 : python pipeline.py

  • 이어서 코드작성

→ pipeline.py를 다음과 같이 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql import functions as F

# print("Hello!!")

# 스파크 세션을 생성
spark = SparkSession.builder.master("local[1]").\
appName("quickpipeline").getOrCreate()

# 데이터 불러오기
df = spark.read.csv("data\AA_DFW_2015_Departures_Short.csv.gz"
, header = True)

print("file loaded")

print(df.show())

# remove duration = 0
df = df.filter(df[3] > 0)

# ADD ID column
df = df.withColumn('id', F.monotonically_increasing_id())
df.show()

df.write.csv("data/output.csv", mode = "overwrite")

spark.stop()

→ 저장 후 실행

python pipeline.py

→ output.csv 가 생성되면 성공이다.

Untitled

pyspark 실습(2)

  • 온도를 측정하는 코드를 작성해본다.
  • 슬랙에서 다운로드
    • 1800.csv, book.txt, customer-orders.csv, fakefriends.csv
  • chapter02_get_cleansing/data 파일에 복사하여 옮긴다.

파일 생성 : min_temp.py

→ 코드 작성

from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster('local').setAppName('MinTemperatures')

sc = SparkContext(conf = conf)

print("Hello")

→ 저장 후 실행

python min_temp.py

  • 이어서 코드작성

→ min_temp.py를 다음과 같이 작성

from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster(‘local’).setAppName(‘MinTemperatures’)

sc = SparkContext(conf = conf)

print(“Begins…”)

def parseLine(line):

fileds = line.split(‘,’) # 문자열을 split

stationID = fileds[0]

entryType = fileds[2]

temperature = float(fileds[3]) * 0.1 * (9.0 / 5.0) + 32.0

return (stationID, entryType, temperature)

lines = sc.textFile(‘data/1800.csv’)

#print(lines)

parseLines = lines.map(parseLine)

#print(parseLine)

minTemps = parseLine.filter(lambda x : “TMIN” in x[1])

stationTemps = minTemps.map(lambda x: (x[0], x[2]))

minTemps = stationTemps.map(lambda x, y: min(x,y))

results = minTemps.collect()

print(results)

→ 저장 후 실행

python min_temp.py

pyspark 실습(3)

  • 나이를 출력하는 코드를 작성해보자

파일 생성 : friends-by-age.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster("local").setAppName("FriendsByAge")
sc = SparkContext(conf = conf)

def parseLine(line):
fields = line.split(',')
age = int(fields[2])
numFriends = int(fields[3])
return (age, numFriends)

lines = sc.textFile("logs/fakefriends.csv")
rdd = lines.map(parseLine)
totalsByAge = rdd.mapValues(lambda x: (x, 1)).reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))
averagesByAge = totalsByAge.mapValues(lambda x: x[0] / x[1])
results = averagesByAge.collect()
for result in results:
print(result)

→ 저장 후 실행

python friends-by-age.py

pyspark 실습(4)

파일 생성 : totalspent.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 라이브러리 불러오기
from pyspark import SparkConf, SparkContext

# 사용자 정의 함수
def extractCusPrice(line):
fields = line.split(",")
return (int(fields[0]), float(fields[2]))

# main 함수
def main():

# 스파크 설정
conf = SparkConf().setMaster("local").setAppName('SpentbyCustomer')
sc = SparkContext(conf = conf)

# 데이터 불러오기
input = sc.textFile("data/customer-orders.csv")
# print("is data?")
mappedInput = input.map(extractCusPrice)
totalByCustomer = mappedInput.reduceByKey(lambda x, y : x + y)
# 정렬
filpped = totalByCustomer.map(lambda x: (x[1], x[0]))
totalByCustomerStored = filpped.sortByKey()

results = totalByCustomer.collect()
for result in results:
print(result)

# 실행 코드
if __name__ == "__main__":
main()

→ 저장 후 실행

python totalspent.py