데이터엔지니어링

[5주차] SQL을 이용한 데이터 분석(2)

heecup 2024. 4. 23. 17:06

🙂 Redshift

클러스터 정보

  • 1 x dc2.large instance: 160GB
  • Host: learnde.cduaw....
  • Port number: 5439
  • Database name: 

웹서비스 사용자/세션 정보

  • 사용자 ID: 보통 웹서비스에서는 등록된 사용자마다 부여하는 유일한 ID
  • 세션 ID: 세션마다 부여되는 ID
    • 세션: 사용자의 방문을 논리적인 단위로 나눈 것
      • 사용자가 외부 링크를 타고 오거나 직접 방문할 경우 세션 생성
      • 사용자가 방문 후 30분간 interaction이 없다가 뭔가를 하는 경우 새로 세션을 생성
    • 하나의 사용자가 여러 세션을 가질 수 있음
    • 보통 세션의 경우 세션을 만들어낸 접점을 "채널"이란 이름으로 기록
    • 세션이 생긴 시간도 기록
  • 위 정보를 기반으로 다양한 데이터 분석과 지표 설정이 가능.
    • 마케팅 관련, 사용자 트래픽 관련
    • DAU, WAU, MAU 등의 일주월별 Active User 차트
    • Marketing Channel Attribution 분석
      • 어느 채널에 광고를 하는 것이 가장 효과적인가?

🙂 SQL

SQL 기본

  • 다수의 SQL문을 실행한다면 세미콜론으로 분리
    • sql1; sql2; slq3;
  • SQL 주석
    • -- : 인라인 주석
    • /* -- */ : 여러 줄에 걸친 주석

 SQL DDL - 테이블 구조 정의 언어

  • CREATE TABLE
    • Primary key 속성을 지정할 수 있으나 무시됨
      • Primary key uniqueness
        • Big Data DW에서는 지켜지지 않음 (Redshift, Snowflake, BigQuery)
        • 대량의 레코드를 계속 검토하게 되면 성능이 나지 않기 때문
    • CTAS: CREATE TABLE table_name AS SELECT
      • vs. CREATE TABLE and then INSERT
CREATE TABLE raw_data.user_session_channel (
    userid int,
    sessionid varchar(32) primary key,
    channel varchar(32)
);
  • DROP TABLE
    • DROP TABLE table_name;
      • 없는 테이블을 지우려고 하는 경우 에러
    • DROP TABLE IF EXISTS table_name;
    • vs. DELETE FROM
      • DELETE FROM 은 조건에 맞는 레코드를 지움. (테이블은 존재)
  • ALTER TABLE
    • 새로운 컬럼 추가
      • ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
    • 기존 컬럼 이름 변경
      • ALTER TABLE 테이블이름 RENAME 현재필드이름 TO 새필드이름;
    • 기존 컬럼 제거
      • ALTER TABLE 테이블이름 DROP COLUMN 필드이름;
    • 테이블 이름 변경
      • ALTER TABLE 현재테이블이름 RENAME TO 새테이블이름;

 SQL DML - 테이블 데이터 조작 언어

  • 레코드 질의 언어: SELECT
    • SELECT FROM: 테이블에서 레코드와 필드를 읽음.
    • WHERE를 사용해서 레코드 선택 조건 지정
    • GROUP BY를 통해 정보를 그룹 레벨에서 뽑는 데 사용
      • DAU, WAU, MAU 계산은 GROUP BY를 필요로 함
    • ORDER BY를 사용해서 레코드 순서를 결정
    • 보통 다수의 테이블을 조인해서 사용
  • 레코드 수정 언어:
    • INSERT INTO: 테이블에 레코드를 추가하는데 사용
    • UPDATE FROM: 테이블 레코드 수정
    • DELETE FROM: 테이블에서 레코드 삭제 (트랜젝션에 사용가능)
      • VS. TRUNCATE: (트랜젝션에 사용 불가)

 SELECT

테이블에서 레코드를 읽어오는 데 사용

WHERE를 사용해 조건을 만족하는 레코드

SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 선택조건
GROUP BY 필드이름1, 필드이름2, ...
ORDER BY 필드이름 [ASC|DESC] 
LIMIT N;

 NULL

  • 값이 존재하지 않음을 나타내는 상수. 0 혹은 ""과는 다름.
  • 필드 지정시 값이 없는 경우 NULL로 지정 가능
    • 테이블 정의 시 디폴트 값으로도 지정 가능
  • 어떤 필드의 값이 NULL인지 아닌지 비교는 특수한 문법을 필요로 함
    • field1 is NULL 혹은 field1 is not NULL
  • NULL이 사칙연산에 이용되면 결과도 NULL

ORDER BY

  • NULL값
    • NULL 값은 오름차순일 경우 (ASC), 마지막에 위치
    • NULL 값은 내림차순일 경우 (DESC), 처음에 위치
    • 이를 바꾸고 싶다면 NULLS FIRST 혹은 NULLS LAST 사용

 

 


🙂 데이터에 대해 기억할 점

의(疑) 데이터증

  • 항상 데이터를 믿을 수 있는지 의심
  • 여유있을 때 데이터를 일일이 살필 것

 데이터 품질 체크

  • 중복 데이터
  • 최근 데이터의 존재 여부 (freshness)
  • Primary key uniqueness 체크
  • null 값 체크

코드로 unit test로 구현해서 쉽게 체크하는 것을 추천

 어느 시점이 되면 많은 테이블이 존재

  • 회사 성장과 관련
  • 중요 테이블이 무엇이고 메타 정보를 잘 관리하는 것이 중요

Data Discovery의 문제

  • 무슨 테이블에 내가 원하고 신뢰할 수 있는 정보가 있나?
  • 테이블에 대해 질문을 하고 싶은데 누구에게 해야하나?

다양한 오픈소스와 서비스

  • DataHub (LinkedIn), Amundsen (Lyft), ...
  • Select Star, DataFrame, ...