데이터 수집 → 데이터 가공 → 데이터 분석. raw data로 바로 분석이 가능한 경우는 거의 없으므로 분석할 수 있도록 데이터를 가공해주어야 함.
아래 각각의 경우에 대해 MySQL, postgreSQL, pySpark, pandas 네 개의 미들웨어에서 어떻게 진행할 수 있는지 모두 경험해보았다.
아직은 네 개 미들웨어의 문법이 다 익숙하지는 않기에 일단 mySQL위주로 정리, 추후 복습해서 동일한 경우가 어떻게 다른지 따로 정리해봐야겠다.
CASE문
1,2,3으로만 되어 있던 디바이스 정보를, 식별할 수 있는 문자로 변경해준다.
SELECT user_id , CASE WHEN register_device = 1 THEN '데스크톱' WHEN register_device = 2 THEN '스마트폰' WHEN register_device = 3 THEN '애플리케이션' END AS devise_name FROM mst_users ;
MYSQL SUBSTRING
substring(string, 추출이 시작되는 곳, 추출글자개수)SELECT stamp, SUBSTRING_INDEX(SUBSTRING_INDEX(referrer, '/', 3), '/', -1) AS referrer_host FROM access_log;
MYSQL
SELECT stamp, url, SUBSTRING_INDEX(REGEXP_SUBSTR(url, '([^?#]+)'), SUBSTRING_INDEX(url, '/', 3), -1) AS path, SUBSTRING_INDEX(REGEXP_SUBSTR(url, 'id=([^&]*)'), 'id=', -1) AS id FROM access_log ;
워낙 복잡하기에 MySQL에서는 이렇게 많이 쓰지 않고 판다스나 스파크를 주로 사용한다고 함
MYSQL
split_part(string,분할 기준 문자,위치)SELECT stamp, url, SUBSTRING_INDEX(REGEXP_SUBSTR(url, '([^?#]+)'), SUBSTRING_INDEX(url, '/', 3), -1) AS path, SUBSTRING_INDEX(REGEXP_SUBSTR(url, 'id=([^&]*)'), 'id=', -1) AS id FROM access_log ;
보는 것처럼 매우 복잡! 역시 계층 추출은 MySQL으로는 잘 하지 않음
MYSQL (postgreSQL도 동일)
SELECT CURRENT_DATE AS dt, CURRENT_TIMESTAMP AS stamp ;
#1 postgreSQL 가능, MySQL 불가능 SELECT CAST('2022-07-27' AS date) AS dt, CAST('2022-07-27 12:00:00' AS timestamp) AS stamp ;
#2 postgreSQL 가능, MySQL 가능 SELECT date '2022-07-27' AS dt, timestamp '2022-07-27 12:00:00' AS stamp ;
#3 postgreSQL 가능, MySQL 불가능 SELECT '2022-07-27'::date AS dt, '2022-07-27 12:00:00'::timestamp AS stamp ;
두 번째 방식이 가장 공통적으로 많이 가능하기 때문에 이걸로 기억해두면 좋음
MYSQL
#EXTRACT 함수로 SELECT stamp, EXTRACT(YEAR FROM stamp) AS year, EXTRACT(MONTH FROM stamp) AS month, EXTRACT(DAY FROM stamp) AS day, EXTRACT(HOUR FROM stamp) AS hour FROM (SELECT timestamp '2022-07-27 12:00:00' AS stamp) AS t ;
#substring 함수로 SELECT stamp, substring(stamp, 1, 4) AS year, substring(stamp, 6, 2) AS month, substring(stamp, 9, 2) AS day, substring(stamp, 12, 2) AS hour, substring(stamp, 1, 7) AS 'year_month' FROM (SELECT '2022-07-27 12:00:00' AS stamp) AS t ;
year_month와 같이 실무에서는 연월을 붙여서 분석하는 경우가 많음. 이 경우에는 timestamp는 연 월을 따로 추출해서 합치는 작업까지 해주어야 하지만, 저렇게 substring으로 문자열 형태로 추출하는게 더 빠르고 간편함
pgAdmin으로 postgreSQL을 접속하려고 하면 password authentication 에러가 계속 발생했다. 구글링해서 여러 해결방법을 시도해봤지만 결국 모두 실패, 완전히 삭제하고 brew로 설치하는 방법으로 해결했다.
아래 노션 링크로 우선 이 경험을 정리해보았다. 추후 시간되면 velog로 다시 정리해봐야지.
https://www.notion.so/PostgreSQL-b9a94861112e45f199c013a0c303cb2b