Skip to content

Repository files navigation

Spotify Tracks ETL Pipeline

Một đường ống ETL (Extract, Transform, Load) mạnh mẽ để xử lý tập dữ liệu Spotify Tracks từ Kaggle. Dự án này trích xuất dữ liệu, làm sạch, chuẩn hóa các thuộc tính nhạc, tạo mô hình dữ liệu Star Schema và tải vào PostgreSQL hoặc MySQL.

Mục Lục


Tính Năng

Trích xuất dữ liệu tự động từ Kaggle API Làm sạch dữ liệu toàn diện (ID, Tên, Năm) Chuẩn hóa thuộc tính âm thanh (Min-Max Scaling) Mô hình dữ liệu Star Schema với bảng chiều & bảng sự kiện Hỗ trợ PostgreSQL & MySQL Xác minh dữ liệu sau tải Xử lý lỗi mạnh mẽ & logging chi tiết Docker Compose để dễ dàng khởi tạo database


Yêu Cầu Hệ Thống

  • Python: 3.8 trở lên
  • Docker & Docker Compose: Để chạy PostgreSQL/MySQL
  • Kaggle Account: Để tải dataset (có Kaggle API key)
  • Bộ nhớ: Tối thiểu 2GB (tùy thuộc vào kích thước dataset)

Cài Đặt & Hướng Dẫn Nhanh

A. Clone Dự Án

git clone https://github.com/devhysterical/spotify-data-pipeline.git
cd spotify-data-pipeline

B. Thiết Lập Môi Trường Docker

Đảm bảo Docker và Docker Compose đã được cài đặt. Sau đó chạy:

# Khởi động PostgreSQL (mặc định)
docker-compose up -d postgresql
# HOẶC khởi động MySQL
docker-compose up -d mysql
# Kiểm tra trạng thái
docker-compose ps

Thông tin kết nối mặc định: PostgreSQL:

  • Host: localhost
  • Port: 5432
  • User: spotify_user
  • Password: spotify_password
  • Database: spotify_db MySQL:
  • Host: localhost
  • Port: 3306
  • User: spotify_user
  • Password: spotify_password
  • Database: spotify_db

C. Cài Đặt Phụ Thuộc Python

# Tạo virtual environment (tùy chọn nhưng khuyên dùng)
python -m venv venv
# Kích hoạt virtual environment
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
# Cài đặt dependencies
pip install -r requirements.txt

D. Cấu Hình Kaggle API

  1. Tạo tài khoản Kaggle tại: https://www.kaggle.com
  2. Tải API key từ Settings -> API -> "Create New API Token"
  3. Đặt file kaggle.json vào ~/.kaggle/ (Windows: C:\Users\<YourUsername>\.kaggle\) Hoặc thiết lập biến môi trường:
# Tạo file .env từ .env.example
cp .env.example .env
# Chỉnh sửa .env và điền thông tin Kaggle
# KAGGLE_USERNAME=your_username
# KAGGLE_KEY=your_api_key

E. Chạy ETL Pipeline

Sử dụng PostgreSQL (mặc định):

cd src
python main.py

Sử dụng MySQL:

cd src
python main.py --mysql

Cấu Trúc Dự Án

spotify-data-pipeline/
├── .github/
│   └── copilot/
│       ├── copilot-instructions.md      # Hướng dẫn chi tiết cho Copilot
│       └── copilot-implementation-plan.md # Kế hoạch thực hiện
├── src/
│   ├── __init__.py                      # Package initialization
│   ├── extract.py                       # Module trích xuất dữ liệu
│   ├── transform.py                     # Module chuyển đổi dữ liệu
│   ├── load.py                          # Module tải dữ liệu
│   └── main.py                          # Script chính (điều phối ETL)
├── data/                                # Thư mục lưu trữ dữ liệu
├── notebooks/                           # Jupyter Notebooks (tùy chọn)
├── docker-compose.yml                   # Cấu hình Docker containers
├── requirements.txt                     # Python dependencies
├── .env.example                         # Mẫu cấu hình môi trường
├── .gitignore                           # Git ignore rules
└── README.md                            # Tài liệu này

Chi Tiết Các Bước ETL

1. EXTRACT (Trích xuất dữ liệu)

File: src/extract.py Lớp SpotifyExtractor xử lý:

  • Kiểm tra tệp dữ liệu cục bộ
  • Tải dataset từ Kaggle tự động (nếu chưa tồn tại)
  • Đọc CSV vào Pandas DataFrame
  • Xử lý lỗi chi tiết
from extract import SpotifyExtractor
extractor = SpotifyExtractor(data_dir="data")
df = extractor.extract()  # Trả về DataFrame

2. TRANSFORM (Chuyển đổi dữ liệu)

File: src/transform.py Lớp SpotifyTransformer xử lý:

A. Làm sạch dữ liệu cốt lõi

  • ID: Loại bỏ bản ghi trùng lặp
  • Tên: Xóa khoảng trắng, chuẩn hóa chữ hoa/thường
  • Năm: Chuyển đổi thành integer, loại bỏ giá trị không hợp lệ

B. Xử lý giá trị NA/NaN

  • Loại bỏ hàng có NA trong cột quan trọng

C. Chuẩn hóa thuộc tính âm thanh

  • Áp dụng Min-Max Scaling cho: danceability, energy, tempo
  • Chuyển giá trị về phạm vi [0, 1]

D. Tạo Star Schema

  • Bảng chiều (dim_artists): Chứa nghệ sĩ duy nhất
  • Bảng sự kiện (fact_tracks): Chứa dữ liệu bài hát với các chỉ số đã chuẩn hóa
from transform import SpotifyTransformer
transformer = SpotifyTransformer(df_raw)
dim_artists, fact_tracks = transformer.transform()

3. LOAD (Tải dữ liệu)

File: src/load.py Lớp SpotifyLoader xử lý:

  • Kết nối đến PostgreSQL hoặc MySQL
  • Tạo bảng (nếu chưa tồn tại)
  • Tải dữ liệu bằng bulk insertion (hiệu quả)
  • Xác minh dữ liệu đã tải
from load import DatabaseConnection, SpotifyLoader
db_config = {
    'user': 'spotify_user',
    'password': 'spotify_password',
    'host': 'localhost',
    'port': 5432,
    'database': 'spotify_db'
}
db_connection = DatabaseConnection(db_type="postgresql", **db_config)
loader = SpotifyLoader(db_connection)
loader.load(dim_artists, fact_tracks)

Cấu Hình Cơ Sở Dữ Liệu

Docker Compose Services

File: docker-compose.yml Cung cấp 2 services:

PostgreSQL (mặc định)

services:
  postgresql:
    image: postgres:15-alpine
    container_name: spotify_postgres_db
    environment:
      POSTGRES_USER: spotify_user
      POSTGRES_PASSWORD: spotify_password
      POSTGRES_DB: spotify_db
    ports:
      - "5432:5432"

MySQL (tùy chọn)

services:
  mysql:
    image: mysql:8.0
    container_name: spotify_mysql_db
    environment:
      MYSQL_USER: spotify_user
      MYSQL_PASSWORD: spotify_password
      MYSQL_DATABASE: spotify_db
    ports:
      - "3306:3306"

Lệnh Docker Compose Hữu Dụng

# Khởi động PostgreSQL
docker-compose up -d postgresql
# Khởi động MySQL
docker-compose up -d mysql
# Dừng tất cả services
docker-compose down
# Xem logs
docker-compose logs -f postgresql
# Kiểm tra trạng thái
docker-compose ps

Sử Dụng

Chạy Pipeline Toàn Diện

cd src
python main.py

Output mong đợi:

SPOTIFY TRACKS ETL PIPELINE
============================================================
BƯỚC 1: EXTRACT (Trích xuất dữ liệu)
============================================================
 Trích xuất dữ liệu thành công
 Dữ liệu thô: 114000 hàng, 23 cột
============================================================
BƯỚC 2: TRANSFORM (Chuyển đổi và làm sạch dữ liệu)
============================================================
 Chuyển đổi dữ liệu thành công
 Bảng dim_artists: 1500 hàng
 Bảng fact_tracks: 110000 hàng
============================================================
BƯỚC 3: LOAD (Tải dữ liệu vào cơ sở dữ liệu)
============================================================
 Tải dữ liệu thành công
============================================================
 ETL PIPELINE HOÀN THÀNH THÀNH CÔNG
============================================================

Chạy từng module riêng lẻ

Extract:

cd src
python extract.py

Transform (cần file CSV):

cd src
python transform.py

Load (cần DataFrames):

cd src
python load.py

Sử dụng trong Jupyter Notebook

# 1. Extract
from src.extract import SpotifyExtractor
extractor = SpotifyExtractor()
df = extractor.extract()
# 2. Transform
from src.transform import SpotifyTransformer
transformer = SpotifyTransformer(df)
dim_artists, fact_tracks = transformer.transform()
# 3. Load
from src.load import DatabaseConnection, SpotifyLoader
db_config = {...}
db_connection = DatabaseConnection(db_type="postgresql", **db_config)
loader = SpotifyLoader(db_connection)
loader.load(dim_artists, fact_tracks)

⚠️ Khắc Phục Sự Cố

Lỗi: "Kaggle API not found"

Giải pháp:

pip install kaggle

Đảm bảo file kaggle.json được đặt đúng vị trí:

  • Windows: C:\Users\<YourUsername>\.kaggle\kaggle.json
  • macOS/Linux: ~/.kaggle/kaggle.json

Lỗi: "Cannot connect to database"

Kiểm tra:

# Kiểm tra Docker containers
docker-compose ps
# Xem logs
docker-compose logs postgresql  # hoặc mysql
# Kiểm tra health
docker exec spotify_postgres_db pg_isready -U spotify_user

Lỗi: "ModuleNotFoundError: No module named 'pandas'"

Giải pháp:

pip install -r requirements.txt

Lỗi: "Dataset not found on Kaggle"

Kiểm tra:

  • Tên dataset có chính xác không: nelsonbjr/spotify-tracks-db
  • Kaggle API key có hợp lệ không
  • Có internet connection không

📝 Cấu Hình Nâng Cao

Sử dụng file .env

# Tạo .env từ .env.example
cp .env.example .env
# Chỉnh sửa .env
# POSTGRES_USER=your_user
# POSTGRES_PASSWORD=your_password
# POSTGRES_HOST=your_host
# ...

Tùy chỉnh cấu hình database

Chỉnh sửa docker-compose.yml để thay đổi:

  • Tên database
  • User/password
  • Port
  • Volume storage

🔐 Bảo Mật

⚠️ QUAN TRỌNG:

  • Không commit file .env lên Git
  • Sử dụng mật khẩu mạnh cho database
  • Quản lý Kaggle API key an toàn
  • Giới hạn quyền truy cập database

Hỗ Trợ

Nếu gặp vấn đề:

  1. Kiểm tra file .github/copilot/copilot-instructions.md để hiểu yêu cầu chi tiết
  2. Xem logs trong các file module
  3. Mở issue trên GitHub

Cảm Ơn

  • Kaggle - Cung cấp dataset
  • Pandas, NumPy, SQLAlchemy - Thư viện Python tuyệt vời
  • Docker - Containerization platform

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages