[데이터 엔지니어링 데브코스 2기] TIL-6주차-파트03 데이터 웨어하우스와 SQL과 데이터분석(2)

이재호·2023년 11월 14일
0

1. AWS 가입 및 RedShift의 cluster 생성

다음의 절차에 따라 진행하였습니다.

  1. AWS 가입 및 무료 계정 등록.
  2. AWS console에서 RedShift 검색 후, redshift serverless trial free 등록.
  3. redshift serverless의 좌측 탐색 메뉴에서 프로비저닝된 클러스터 대시보드 선택.
  4. 클러스터 생성 진행. 이때 하단의 네트워크 config에서 public access로 변환.



2. 테이블 정보

예제) 웹 사이트에서 각 유저의 정보와 세션 정보 저장 테이블.

  1. user id

  2. session id

    • 사용자의 방문을 논리적인 단위로 나눈 것.
    • 사용자가 방문 후 특정 시간 동안 interaction이 없다가 뭔가를 할 경우 새 session 생성.
    • 사용자가 외부 링크(광고)를 타고 오거나 직접 방문해서 올 경우 session 생성.
    • 즉 하나의 사용자는 여러 개의 session을 가질 수 있음.
    • session을 만들 때마다 세션을 만들어 낸 채널의 정보 저장. ex) youtube를 통해서 들어온 경우, 채널은 youtube가 됨.
    • session이 생긴 시각 저장.(time stamp)
  3. 정리) 기록되는 정보: 사용자 id, 세션 id, 세션 생성 시각, 채널

위 정보들을 통해서 데이터 분석 및 지표 설정이 가능합니다.

  • 마케팅 관련, 사용자 트래픽 관련.
  • DAU(Daily Active User), WAU, MAU 등의 일/주/월 별 Active User 카운트가 가능.
  • 마케팅 채널 attribution 분석 가능. (어느 채널에 광고를 하는 것이 가장 효율적인지.)



3. SQL 기본 문법

3-1. 기본

  • 다수의 SQL문 실행 시 세미콜론이 필요합니다. ex) SQL문1; SQL문2; SQL문3;

  • 주석처리 방법은 다음과 같습니다.

    • "--" : 한 줄 주석. C의 "//"와 동일.
    • "/* */" : 여러 줄 주석.
  • SQL 키워드는 대문자로 포맷팅합니다. ex) SELECT, FROM, WHERE, ..

  • 테이블과 필드 이름의 명명규칙을 정해야 합니다.

    • User (단수형) vs Users (복수형)
    • CamelCasing vs snake_casing

3-2. DDL

  • 테이블 구조 정의 언어.

  • primary key 속성을 지정할 수 있으나 무시됩니다. (not primary key uniqueness)

  • 테이블 생성 예시)

    	CREATE TABLE schema_name.table_name(
    			field_1 field_1의 타입,
    		    field_2 field_2의 타입
          );
  • CTAS (생성과 동시에 레코드 저장)

    	CREATE TABLE schema_name.table_name AS SELECT ~~;

    => SELECT를 통해서 읽은 레코드로 table을 생성함.

  • 테이블 삭제

    	DROP TABLE IF EXISTS(예외처리) schema_name.table_name;

    => table_name의 table이 있다면 해당 table을 삭제함.

  • 테이블 변경

    1. 칼럼 추가) ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
    2. 칼럼 변경) ALTER TABLE 테이블이름 RENAME 현재 필드이름 TO 새 필드이름;
    3. 칼럼 삭제) ALTER TABLE 테이블이름 DROP COLUMN 필드이름;
    4. 테이블 이름 변경) ALTER TABLE 테이블이름 RENAME TO 새 테이블이름;

3-3. DML

  • 테이블 데이터 조작 언어.

  • 삽입) INSERT INTO 테이블이름 VALUES(); 해당 연산은 속도가 느려서, 보통 bulk update 방식으로 합니다.

  • 삭제)

    • DELETE FROM schema_name.table_name; => 테이블 내 레코드만 삭제. (테이블은 존재.)
    • TRUNCATE => 위와 기능은 동일하며, 다만 TRANSACTION에 사용이 불가능하다는 차이점이 있습니다.
  • 선택)

    SELECT 필드이름1, 필드이름2, ...
     FROM 테이블이름
     WHERE 선택 조건
     GROUP BY 필드이름1, 필드이름2, ...
     ORDER BY 필드이름 ASC or DESC
     LIMIT N;
  • SELECT DISTINCT channel FROM ~~; : 유일한 채널 이름을 알고 싶은 경우.

  • SELECT DISTINCT channel, COUNT(1) FROM ~~ GROUP BY 1; : 채널별 카운트를 하고 싶은 경우. 1은 channel이 1번 필드이기 때문에 1로도 작성 가능. GROUP BY channel과 동일한 기능.

  • CASE WHEN 조건1 THEN 값1 WHEN 조건2 THEN 갑2 ELSE 값3 END 필드이름 : 특정 조건에 따라 값을 리턴 가능.

  1. STRING

    • LEFT(str, N) : str에서 왼쪽에서부터 N개 만큼 반환.
    • REPLACE(str, exp1, exp2) : str에서 exp1을 찾아서 exp2로 변환.
    • UPPER(str) : str을 대문자로.
    • LOWER(str) : str을 소문자로.
    • LEN(str) : str의 길이.
    • LPAD, RPAD : 문자의 왼쪽or오른쪽에 string padding
    • SUBSTRING : 문자열에서 시작점 ~ N개 만큼 리턴
  2. ORDER BY

    • ORDER BY NULLS FIRST or NULLS LAST : NULL의 순서 결정.
  3. TIME

    • CONVERT_TEIMZONE('지역', time stamp) : ts를 해당 지역 기준으로 타임존 변환.
    • DATE, TRUNCATE : 날짜만 리턴. YYYY-MM-DD
    • DATE_TRUNC
    • EXRACT or DATE_PART : 날짜의 특정 파트만 리턴. 연도 or 월 or 일
    • DATEDIFF
    • DATEADD
    • GET_CURRENT
    • TO_CHAR, TO_TIMESTAMP
  4. Type Casting

    • category::float
    • cast(category as float)



4. 데이터 처리 관련 고려 사항

현업에서 깨끗한 데이터란 존재하지 않습니다. 그러므로 항상 데이터를 의심해야 합니다. 그러기 위해서는 노가다(?)식으로 실제 레코드를 살펴보는 수밖에 없습니다.

4-1. 데이터 품질

데이터 품질에 관해서 다음과 같은 내용을 고려할 필요가 있습니다.

  • 중복된 레코드들 체크하기.
  • 최근 데이터의 존재 여부 체크하기. (freshness)
  • Primary key uniqueness가 지켜지는지 체크하기.
  • 값이 비어있는 칼럼들이 있는지 체크하기.
  • 위의 체크 리스트를 unit test 형태로 만들어 테스트하기.

회사가 성장하고 어느 시점이 되면 너무나 많은 테이블들이 생기게 됩니다.

따라서, 회사 성장과 밀접한 관련이 있으며 중요 테이블들이 무엇이고 그것들의 메타 정보를 잘 관리하는 것이 중요합니다.

Data Discovery 문제를 해결하기 위한 다양한 오픈소스와 서비스들이 출현했습니다.

  • DataHub, Amundsen, ..
  • Select Star, DataFrame, ..



5.

profile
천천히, 그리고 꾸준히.

0개의 댓글