데이터 엔지니어( 실습 정리 )

postsql 도커 컨테이너 구축

세용용용용 2024. 5. 22. 10:20

0. 로컬 추가 설정

# postsql 데이터 유지를 위한 마운트 디렉토리
mkdir /postgresql_v

 

1. 도커 파일

# Base image
FROM postgres:latest

# 환경 변수 설정
ENV POSTGRES_USER=root
ENV POSTGRES_PASSWORD=!nds1101
ENV POSTGRES_DB=textmin

# 로컬 초기화 스크립트 복사
COPY init-db.sh /docker-entrypoint-initdb.d/
# 포트 열기
EXPOSE 5432

 

1-1. init-db.sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username root --dbname textmin <<-EOSQL
    CREATE TABLE example_table (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL
    );
EOSQL

 

2. 도커 이미지 build, 컨테이너 실행

# 이미지 빌드
docker build -t postsql_image .

# 컨테이너 실행
docker run --name postsql -v /postgresql_v:/var/lib/postgresql/data -p 5432:5432 -d postsql_image

# 접속 테스트
docker exec -it postsql psql -U root -d textmin

 

3. 메일 데이터 저장을 위한 테이블 생성

CREATE TABLE IF NOT EXISTS text_data (
    id SERIAL PRIMARY KEY,
    v1 VARCHAR(255),
    v2 TEXT
);

 

4. CSV 파일 기본 전처리 >> insert to postsql

4-1. make_csv.py

#!/usr/bin/env python3

import pandas as pd
import urllib.request
import subprocess

# 데이터 파일 다운로드
url = "https://raw.githubusercontent.com/ukairia777/tensorflow-nlp-tutorial/main/10.%20RNN%20Text%20Classification/dataset/spam.csv"
filename = "spam.csv"
urllib.request.urlretrieve(url, filename)

# 데이터 읽기 및 필요한 컬럼만 추출
data = pd.read_csv('spam.csv', encoding='latin1')
data = data[['v1', 'v2']]
data['v1'] = data['v1'].replace(['ham','spam'],[0,1])

data.drop_duplicates(subset=['v2'], inplace=True)

# CSV 파일로 저장
data.to_csv('change_spam.csv', sep='\t',index=False)

# 캐리지 리턴 문자 치환
subprocess.run(["sed", "-i", "s/\r//g", "/work/change_spam.csv"])

 

4-2. insert_postsql.py

#!/usr/bin/env python3
import psycopg2
from psycopg2 import sql

# PostgreSQL 연결 정보 설정
conn_params = {
    'dbname': 'textmin',
    'user': 'root',
    'password': '!nds1101',
    'host': '169.254.226.50',
    'port': 5432
}

# 데이터베이스 연결
conn = psycopg2.connect(**conn_params)
cur = conn.cursor()

# 데이터 삽입 sql 쿼리
insert_query = """
    INSERT INTO text_data (label, text) VALUES (%s, %s);
"""

# csv파일 데이터 읽기 >> postsql insert
with open('/work/change_spam.csv', 'r') as f:
    next(f)  # 첫 번째 라인은 헤더이므로 건너뜁니다.
    for line in f:
        label, text = line.split('\t')  # CSV 파일에서 label과 text를 읽어옵니다.
        cur.execute(insert_query, (label, text))  # 데이터 삽입 쿼리 실행

# 변경 내용 커밋
conn.commit()

# 연결 종료
cur.close()
conn.close()