تحتوي مجموعة البيانات هذه على أكثر من 150 مليون مراجعة للعملاء على منتجات أمازون. توجد البيانات في ملفات Parquet مضغوطة بخوارزمية snappy على AWS S3، ويبلغ حجمها الإجمالي 49 جيجابايت (بعد الضغط). لنستعرض خطوات إدراجها في ClickHouse.
تحميل مجموعة البيانات
- من دون إدراج البيانات في ClickHouse، يمكننا الاستعلام عنها مباشرةً. لنستعرض بعض الصفوف حتى نرى كيف تبدو:
SELECT *
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', NOSIGN)
LIMIT 3تكون الصفوف على النحو التالي:
Row 1:
──────
review_date: 16462
marketplace: US
customer_id: 25444946 -- 25.44 million
review_id: R146L9MMZYG0WA
product_id: B00NV85102
product_parent: 908181913 -- 908.18 million
product_title: XIKEZAN iPhone 6 Plus 5.5 inch Waterproof Case, Shockproof Dirtproof Snowproof Full Body Skin Case Protective Cover with Hand Strap & Headphone Adapter & Kickstand
product_category: Wireless
star_rating: 4
helpful_votes: 0
total_votes: 0
vine: false
verified_purchase: true
review_headline: case is sturdy and protects as I want
review_body: I won't count on the waterproof part (I took off the rubber seals at the bottom because the got on my nerves). But the case is sturdy and protects as I want.
Row 2:
──────
review_date: 16462
marketplace: US
customer_id: 1974568 -- 1.97 million
review_id: R2LXDXT293LG1T
product_id: B00OTFZ23M
product_parent: 951208259 -- 951.21 million
product_title: Season.C Chicago Bulls Marilyn Monroe No.1 Hard Back Case Cover for Samsung Galaxy S5 i9600
product_category: Wireless
star_rating: 1
helpful_votes: 0
total_votes: 0
vine: false
verified_purchase: true
review_headline: One Star
review_body: Cant use the case because its big for the phone. Waist of money!
Row 3:
──────
review_date: 16462
marketplace: US
customer_id: 24803564 -- 24.80 million
review_id: R7K9U5OEIRJWR
product_id: B00LB8C4U4
product_parent: 524588109 -- 524.59 million
product_title: iPhone 5s Case, BUDDIBOX [Shield] Slim Dual Layer Protective Case with Kickstand for Apple iPhone 5 and 5s
product_category: Wireless
star_rating: 4
helpful_votes: 0
total_votes: 0
vine: false
verified_purchase: true
review_headline: but overall this case is pretty sturdy and provides good protection for the phone
review_body: The front piece was a little difficult to secure to the phone at first, but overall this case is pretty sturdy and provides good protection for the phone, which is what I need. I would buy this case again.- لنعرّف جدول
MergeTreeجديدًا باسمamazon_reviewsلتخزين هذه البيانات في ClickHouse:
CREATE DATABASE amazon
CREATE TABLE amazon.amazon_reviews
(
`review_date` Date,
`marketplace` LowCardinality(String),
`customer_id` UInt64,
`review_id` String,
`product_id` String,
`product_parent` UInt64,
`product_title` String,
`product_category` LowCardinality(String),
`star_rating` UInt8,
`helpful_votes` UInt32,
`total_votes` UInt32,
`vine` Bool,
`verified_purchase` Bool,
`review_headline` String,
`review_body` String,
PROJECTION helpful_votes
(
SELECT *
ORDER BY helpful_votes
)
)
ENGINE = MergeTree
ORDER BY (review_date, product_category)- يستخدم أمر
INSERTالتالي دالة الجدولs3Cluster، ما يتيح معالجة عدة ملفات S3 بالتوازي باستخدام جميع عُقد العنقود لديك. ونستخدم أيضًا محرف بدل لإدراج أي ملف يبدأ بالاسمhttps://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet:
INSERT INTO amazon.amazon_reviews SELECT *
FROM s3Cluster('default',
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet', NOSIGN)- هذا الاستعلام لا يستغرق وقتًا طويلًا — إذ يبلغ المتوسط نحو 300,000 صف في الثانية. وخلال 5 دقائق تقريبًا، ينبغي أن ترى أنه قد تم insert جميع الصفوف:
SELECT formatReadableQuantity(count())
FROM amazon.amazon_reviews- لنرَ مقدار المساحة التي تستخدمها بياناتنا:
SELECT
disk_name,
formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed,
formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed,
round(usize / size, 2) AS compr_rate,
sum(rows) AS rows,
count() AS part_count
FROM system.parts
WHERE (active = 1) AND (table = 'amazon_reviews')
GROUP BY disk_name
ORDER BY size DESCكان حجم البيانات الأصلي نحو 70G، لكن بعد ضغطها في ClickHouse أصبحت تشغل نحو 30G.
أمثلة على الاستعلامات
- لنُشغِّل بعض الاستعلامات. فيما يلي أكثر 10 مراجعات فائدةً في مجموعة البيانات:
SELECT
product_title,
review_headline
FROM amazon.amazon_reviews
ORDER BY helpful_votes DESC
LIMIT 10- فيما يلي أكثر 10 منتجات على أمازون من حيث عدد المراجعات:
SELECT
any(product_title),
count()
FROM amazon.amazon_reviews
GROUP BY product_id
ORDER BY 2 DESC
LIMIT 10;- فيما يلي متوسط تقييمات المراجعات شهريًا لكل منتج (وهو سؤال فعلي في مقابلة عمل لدى أمازون!):
SELECT
toStartOfMonth(review_date) AS month,
any(product_title),
avg(star_rating) AS avg_stars
FROM amazon.amazon_reviews
GROUP BY
month,
product_id
ORDER BY
month DESC,
product_id ASC
LIMIT 20;- فيما يلي العدد الإجمالي للأصوات لكل فئة من فئات المنتجات. هذا الاستعلام سريع لأن
product_categoryموجود في المفتاح الأساسي:
SELECT
sum(total_votes),
product_category
FROM amazon.amazon_reviews
GROUP BY product_category
ORDER BY 1 DESC- لنبحث عن المنتجات التي تظهر فيها كلمة "awful" بأعلى تكرار في المراجعات. هذه مهمة كبيرة، إذ يجب تحليل أكثر من 151 مليون سلسلة نصية بحثًا عن كلمة واحدة:
SELECT
product_id,
any(product_title),
avg(star_rating),
count() AS count
FROM amazon.amazon_reviews
WHERE position(review_body, 'awful') > 0
GROUP BY product_id
ORDER BY count DESC
LIMIT 50;لاحظ وقت تنفيذ الاستعلام مع هذا الكم الكبير من البيانات. ومن الممتع أيضًا تصفح النتائج!
- يمكننا تشغيل الاستعلام نفسه مرة أخرى، لكن هذه المرة نبحث عن awesome في المراجعات:
SELECT
product_id,
any(product_title),
avg(star_rating),
count() AS count
FROM amazon.amazon_reviews
WHERE position(review_body, 'awesome') > 0
GROUP BY product_id
ORDER BY count DESC
LIMIT 50;