전 세계의 방대한 데이터가 Amazon S3 버킷에 저장되어 있습니다. 이 가이드에서는 chDB를 사용해 해당 데이터를 쿼리하는 방법을 알아봅니다.
설정
먼저 가상 환경을 만듭니다:
python -m venv .venv
source .venv/bin/activate이제 chDB를 설치하겠습니다. 버전 2.0.2 이상인지 확인하십시오:
pip install "chdb>=2.0.2"이제 IPython을 설치합니다:
pip install ipython이 가이드의 나머지 부분에서는 ipython을 사용해 명령을 실행합니다. 다음 명령을 실행하여 시작할 수 있습니다:
ipython이 코드는 Python 스크립트나 자주 사용하는 노트북에서도 사용할 수 있습니다.
S3 버킷의 파일 나열
먼저 Amazon 리뷰가 포함된 S3 버킷에 있는 모든 파일을 나열해 보겠습니다.
이를 위해 s3 테이블 함수를 사용하고, 파일 경로 또는 파일 집합을 가리키는 와일드카드를 전달할 수 있습니다.
또한 파일을 파싱하지 않고 파일마다 단일 행을 반환하도록 One 입력 형식을 사용합니다. 그러면 _file 가상 컬럼으로 파일에 접근하고 _path 가상 컬럼으로 경로에 접근할 수 있습니다.
import chdb
chdb.query("""
SELECT
_file,
_path
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One)
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐
│ amazon_reviews_2010.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet │
│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │
│ amazon_reviews_2013.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet │
│ amazon_reviews_2015.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet │
│ amazon_reviews_2014.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet │
│ amazon_reviews_2012.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet │
│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │
│ amazon_reviews_2011.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet │
└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘이 버킷에는 Parquet 파일만 들어 있습니다.
S3 버킷의 파일 쿼리
이제 이러한 파일을 쿼리하는 방법을 알아보겠습니다. 각 파일의 행 수를 계산하려면 다음 쿼리를 실행하면 됩니다.
chdb.query("""
SELECT
_file,
count() AS count,
formatReadableQuantity(count) AS readableCount
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')┌─_file───────────────────────────────┬────count─┬─readableCount───┐
│ amazon_reviews_2013.snappy.parquet │ 28034255 │ 28.03 million │
│ amazon_reviews_1990s.snappy.parquet │ 639532 │ 639.53 thousand │
│ amazon_reviews_2011.snappy.parquet │ 6112495 │ 6.11 million │
│ amazon_reviews_2015.snappy.parquet │ 41905631 │ 41.91 million │
│ amazon_reviews_2012.snappy.parquet │ 11541011 │ 11.54 million │
│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million │
│ amazon_reviews_2014.snappy.parquet │ 44127569 │ 44.13 million │
│ amazon_reviews_2010.snappy.parquet │ 3868472 │ 3.87 million │
└─────────────────────────────────────┴──────────┴─────────────────┘S3 버킷의 HTTP URI를 전달해도 동일한 결과를 얻을 수 있습니다:
chdb.query("""
SELECT
_file,
count() AS count,
formatReadableQuantity(count) AS readableCount
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')DESCRIBE 절을 사용해 이 Parquet 파일들의 스키마를 살펴보겠습니다:
chdb.query("""
DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet')
SETTINGS describe_compact_output=1
""", 'PrettyCompact') ┌─name──────────────┬─type─────────────┐
1. │ review_date │ Nullable(UInt16) │
2. │ marketplace │ Nullable(String) │
3. │ customer_id │ Nullable(UInt64) │
4. │ review_id │ Nullable(String) │
5. │ product_id │ Nullable(String) │
6. │ product_parent │ Nullable(UInt64) │
7. │ product_title │ Nullable(String) │
8. │ product_category │ Nullable(String) │
9. │ star_rating │ Nullable(UInt8) │
10. │ helpful_votes │ Nullable(UInt32) │
11. │ total_votes │ Nullable(UInt32) │
12. │ vine │ Nullable(Bool) │
13. │ verified_purchase │ Nullable(Bool) │
14. │ review_headline │ Nullable(String) │
15. │ review_body │ Nullable(String) │
└───────────────────┴──────────────────┘이제 리뷰 수를 기준으로 상위 제품 카테고리를 계산하고, 평균 별점도 함께 계산해 보겠습니다:
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact') ┌─product_category─┬──reviews─┬──avg─┐
1. │ Toys │ 4864056 │ 4.21 │
2. │ Apparel │ 5906085 │ 4.11 │
3. │ Luggage │ 348644 │ 4.22 │
4. │ Kitchen │ 4880297 │ 4.21 │
5. │ Books │ 19530930 │ 4.34 │
6. │ Outdoors │ 2302327 │ 4.24 │
7. │ Video │ 380596 │ 4.19 │
8. │ Grocery │ 2402365 │ 4.31 │
9. │ Shoes │ 4366757 │ 4.24 │
10. │ Jewelry │ 1767667 │ 4.14 │
└──────────────────┴──────────┴──────┘비공개 S3 버킷의 파일 쿼리
비공개 S3 버킷의 파일을 쿼리하려면 액세스 키와 시크릿을 전달해야 합니다.
이러한 자격 증명은 s3 테이블 함수에 전달할 수 있습니다.
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')대안으로 이름이 지정된 컬렉션을 사용할 수 있지만, 이 방법은 아직 chDB에서 지원되지 않습니다.