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.
- Tính Năng
- Yêu Cầu Hệ Thống
- Cài Đặt & Hướng Dẫn Nhanh
- Cấu Trúc Dự Án
- Chi Tiết Các Bước ETL
- Cấu Hình Cơ Sở Dữ Liệu
- Sử Dụng
- Khắc Phục Sự Cố
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
- 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)
git clone https://github.com/devhysterical/spotify-data-pipeline.git
cd spotify-data-pipelineĐả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 psThông tin kết nối mặc định: PostgreSQL:
- Host:
localhost - Port:
5432 - User:
spotify_user - Password:
spotify_password - Database:
spotify_dbMySQL: - Host:
localhost - Port:
3306 - User:
spotify_user - Password:
spotify_password - Database:
spotify_db
# 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- Tạo tài khoản Kaggle tại: https://www.kaggle.com
- Tải API key từ Settings -> API -> "Create New API Token"
- Đặt file
kaggle.jsonvà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_keySử dụng PostgreSQL (mặc định):
cd src
python main.pySử dụng MySQL:
cd src
python main.py --mysqlspotify-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
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ề DataFrameFile: src/transform.py
Lớp SpotifyTransformer xử lý:
- 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ệ
- Loại bỏ hàng có NA trong cột quan trọng
- Áp dụng Min-Max Scaling cho:
danceability,energy,tempo - Chuyển giá trị về phạm vi [0, 1]
- 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()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)File: docker-compose.yml
Cung cấp 2 services:
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"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"# 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 pscd src
python main.pyOutput 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
============================================================
Extract:
cd src
python extract.pyTransform (cần file CSV):
cd src
python transform.pyLoad (cần DataFrames):
cd src
python load.py# 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)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
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_userGiải pháp:
pip install -r requirements.txtKiể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
# 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
# ...Chỉnh sửa docker-compose.yml để thay đổi:
- Tên database
- User/password
- Port
- Volume storage
- Không commit file
.envlê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
Nếu gặp vấn đề:
- Kiểm tra file
.github/copilot/copilot-instructions.mdđể hiểu yêu cầu chi tiết - Xem logs trong các file module
- Mở issue trên GitHub
- Kaggle - Cung cấp dataset
- Pandas, NumPy, SQLAlchemy - Thư viện Python tuyệt vời
- Docker - Containerization platform