۱. مقدمه
در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه از قدرت آپاچی اسپارک برای تبدیل دادهها در رابط کاربری آشنای BigQuery Studio استفاده کنید. شما دادهها را از BigQuery خواهید خواند، پاکسازی و تبدیل دادهها را با استفاده از PySpark انجام خواهید داد و نتایج را در یک جدول جدید BigQuery، همه از یک دفترچه یادداشت، خواهید نوشت.
از طریق codelab، شما یک رویکرد گام به گام به شرح زیر را به کار خواهید گرفت:
- پروژه Google Cloud خود را آماده کنید و تمام API های مورد نیاز را روی آن فعال کنید
- ایجاد سطل GCS برای پوشه موقت
- کتابخانههای مورد نیاز برای اجرای آپاچی اسپارک را وارد کنید
- جلسه Spark را با کانکتور BigQuery آغاز کنید
- نمونه داده Google Analytics را از مجموعه داده عمومی BigQuery بخوانید
- دادهها را با دادههای تجمیعی بر اساس مرورگر دستگاه (معیارهای اساسی) تبدیل کنید.
- دادهها را با تجزیه و تحلیل منبع ترافیک و محاسبات درآمد تبدیل کنید
- دادهها را با تحلیل جغرافیایی تبدیل کنید
- نوشتن دادهها پس از تبدیل به جدول BigQuery
نمای کلی معماری

پیشنیازها
- یک پروژه پلتفرم ابری گوگل (GCP) با قابلیت پرداخت.
- API مربوط به BigQuery و API مربوط به BigQuery Connection که در پروژه GCP شما فعال شدهاند.
- دانش پایه SQL و پایتون.
آنچه یاد خواهید گرفت
- نحوه استخراج دادهها با استفاده از آپاچی اسپارک در BigQuery Studio Notebook
- نحوه تبدیل یا جمع آوری داده ها با استفاده از آپاچی اسپارک در BigQuery Studio Notebook
- نحوه نوشتن دادهها پس از تبدیل یا تجمیع دادهها با استفاده از آپاچی اسپارک در BigQuery Studio Notebook
آنچه نیاز دارید
- مرورگر وب کروم
- یک حساب جیمیل
- یک پروژه ابری با قابلیت پرداخت صورتحساب
۲. تنظیمات اولیه و الزامات
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



- نام پروژه، نام نمایشی برای شرکتکنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمیشود. شما همیشه میتوانید آن را بهروزرسانی کنید.
- شناسه پروژه در تمام پروژههای گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید میکند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاههای کد، باید شناسه پروژه خود را (که معمولاً با عنوان
PROJECT_IDشناخته میشود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، میتوانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، میتوانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی میماند. - برای اطلاع شما، یک مقدار سوم، شماره پروژه، وجود دارد که برخی از APIها از آن استفاده میکنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
- در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینهای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، میتوانید منابعی را که ایجاد کردهاید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
۳. قبل از شروع
فعال کردن API
قبل از استفاده از BigQuery Studio Notebooks، باید API های زیر را فعال کنیم:
- رابط برنامهنویسی کاربردی موتور محاسبات
- رابط برنامهنویسی کاربردی (API) مربوط به فرم داده
- رابط برنامهنویسی کاربردی هوش مصنوعی ورتکس
برای فعالسازی دستی، به Bigquery بروید. در نوار تبهای پنجره ویرایشگر، روی فلش کشویی کنار علامت + کلیک کنید، اشارهگر را روی Notebook نگه دارید و سپس الگوی BigQuery یا Empty Notebook یا الگوی Spark را انتخاب کنید.

در پنجره Enable Core feature API، روی Enable in BigQuery Unified API کلیک کنید.

پس از اتمام، آن را فعال کنید و سپس روی بستن کلیک کنید. برای جزئیات بیشتر، لطفاً به فعال کردن BigQuery Studio برای مدیریت دارایی مراجعه کنید.
۴. خواندن یک مجموعه داده عمومی
ابتدا، یک سطل GCS برای استفاده موقت ایجاد خواهیم کرد تا بتوانیم اسپارک را در BigQuery Studio Notebooks اجرا کنیم.
- در کنسول گوگل کلود، به BigQuery بروید
- در نوار تبهای پنجره ویرایشگر، روی فلش کشویی کنار علامت + کلیک کنید، اشارهگر را روی Notebook نگه دارید و سپس Empty Notebook را انتخاب کنید.

- روی سلول کد کلیک کنید و سپس اسکریپت cli زیر را برای ایجاد سطل GCS تایپ کنید، سپس روی دکمه Run سلول کلیک کنید یا Shift + Enter را فشار دهید.
!gsutil mb -p <your_project_id> -c STANDARD -l US gs://ioxid2025-<your_project_id>
مقادیر <your_project_id> را مطابق با آنچه هنگام ایجاد پروژه Google Cloud انتخاب کردهاید، بهروزرسانی کنید. مقادیر <your_project_id> را با شناسه پروژه خود برای ایجاد نام سطل منحصر به فرد GCS بهروزرسانی کنید. پس از آن، روی دکمه اجرای سلول کلیک کنید یا Shift + Enter را فشار دهید تا سلول کد اجرا شود.
سپس، یک جلسه spark را آغاز خواهیم کرد. در این آزمایشگاه کد، از کتابخانه SparkSession استفاده خواهیم کرد، اگرچه میتوانیم DataprocSession برای بهرهبرداری از قابلیتهای dataproc جهت اجرای spark در BigQuery Studio Notebook استفاده کنیم.
- روی سلول کد کلیک کنید و سپس اسکریپت cli زیر را برای شروع جلسه spark تایپ کنید. روی دکمه Run cell کلیک کنید یا Shift + Enter را فشار دهید.
# Import required libraries
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, count, countDistinct, when, expr, date_format
from pyspark.sql.types import DecimalType
# Initialize Spark session with BigQuery connector
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, count, countDistinct, when, expr, date_format
from pyspark.sql.types import DecimalType
# Initialize Spark session with BigQuery connector
spark = SparkSession.builder \
.appName("Google Analytics ETL with Apache Spark") \
.config("spark.jars.packages", "com.google.cloud.spark:spark-bigquery-with-dependencies_2.12:0.32.0") \
.getOrCreate()
spark
خروجی مورد انتظار:
SparkSession - in-memory SparkContext Spark UI Version v3.5.4 Master local[*] AppName Google Analytics ETL with Apache Spark
- روی سلول کد کلیک کنید و سپس اسکریپت cli زیر را تایپ کنید تا پروژه GCP و باکت موقت GCS تنظیم شوند.
# Set GCP project and temporary bucket
project_id = "your-gcp-project-id" # Replace with your GCP project ID
bucket = "your-gcs-bucket" # Replace with your GCS bucket for temporary files spark.conf.set("temporaryGcsBucket", bucket)
نمونه پایگاه داده گوگل آنالیتیکس
پایگاه داده نمونه گوگل آنالیتیکس از طریق برنامه مجموعه دادههای عمومی گوگل کلود در بیگکوئری ارائه میشود. این مجموعه دادهها، دادههای مبهم گوگل آنالیتیکس ۳۶۰ مربوط به ۱۲ ماه (آگوست ۲۰۱۶ تا آگوست ۲۰۱۷) را از فروشگاه کالاهای گوگل ، یک فروشگاه تجارت الکترونیک واقعی که کالاهای برند گوگل را میفروشد، در بیگکوئری ارائه میدهد. این یک روش عالی برای تجزیه و تحلیل دادههای تجاری و یادگیری مزایای استفاده از بیگکوئری برای تجزیه و تحلیل دادههای آنالیتیکس ۳۶۰ است. درباره دادهها بیشتر بدانید.
دادهها شامل موارد زیر است: این دادهها معمولاً همان چیزی هستند که یک وبسایت تجارت الکترونیک میبیند و شامل اطلاعات زیر است:
- دادههای منبع ترافیک: اطلاعاتی در مورد اینکه بازدیدکنندگان وبسایت از کجا میآیند، شامل دادههای مربوط به ترافیک ارگانیک، ترافیک جستجوی پولی و ترافیک نمایشی
- دادههای محتوا: اطلاعاتی درباره رفتار کاربران در سایت، مانند URL صفحاتی که بازدیدکنندگان مشاهده میکنند، نحوه تعامل آنها با محتوا و غیره.
- دادههای تراکنشی: اطلاعات مربوط به تراکنشها در وبسایت فروشگاه کالاهای گوگل.
برای نمایش ۵ داده برتر در آپاچی اسپارک، کد زیر را اجرا کنید.
# EXTRACT: Read data from BigQuery
print("Extracting data from BigQuery...")
ga_df = spark.read.format("bigquery") \
.option("table", "bigquery-public-data.google_analytics_sample.ga_sessions_20170801") \
.load()
# Show schema sample data
print("Sample data:")
ga_df.show(5, truncate=False)
خروجی مورد انتظار:
Extracting data from BigQuery...
Sample data:
+---------+-----------+----------+--------------+--------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+------+--------+---------------+--------------------+
|visitorId|visitNumber|visitId |visitStartTime|date |totals |trafficSource |device |geoNetwork |customDimensions |hits |fullVisitorId |userId|clientId|channelGrouping|socialEngagementType|
+---------+-----------+----------+--------------+--------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+------+--------+---------------+--------------------+
|NULL |1 |1501591568|1501591568 |20170801|{1, 1, 1, NULL, 1, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1} |{NULL, (not set), (direct), (none), NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, not available in demo dataset, NULL, NULL, NULL, NULL, NULL}, NULL, NULL} |{Chrome, not available in demo dataset, not available in demo dataset, Windows, not available in demo dataset, false, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, NULL, not available in demo dataset, not available in demo dataset, not available in demo dataset, desktop} |{Europe, Southern Europe, Greece, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, tellas.gr, not available in demo dataset, not available in demo dataset, not available in demo dataset} |[] |[{1, 0, 5, 46, NULL, true, true, true, https://www.google.gr/, {/google+redesign/bags/google+zipper+front+sports+bag.axd, shop.googlemerchandisestore.com, Page Unavailable, NULL, NULL, /google+redesign/, /bags/, /google+zipper+front+sports+bag.axd, }, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, shop.googlemerchandisestore.com/google+redesign/bags/google+zipper+front+sports+bag.axd, shop.googlemerchandisestore.com/google+redesign/bags/google+zipper+front+sports+bag.axd, shop.googlemerchandisestore.com/google+redesign/bags/google+zipper+front+sports+bag.axd, 0}, {NULL, true, NULL, NULL}, NULL, [], [], NULL, NULL, {0, 1, NULL}, [], NULL, [], [], [], PAGE, {NULL, NULL, NULL, NULL, (not set), NULL, No, : }, NULL, NULL, {(not set), Bags, (not set), (not set), (not set), (entrance), (entrance), (entrance), (entrance), (entrance), NULL, 1, NULL, NULL, NULL}, web, []}] |3418334011779872055|NULL |NULL |Organic Search |Not Socially Engaged|
|NULL |2 |1501589647|1501589647 |20170801|{1, 1, 1, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1}|{/analytics/web/, (not set), analytics.google.com, referral, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, not available in demo dataset, NULL, NULL, NULL, NULL, NULL}, NULL, NULL}|{Chrome, not available in demo dataset, not available in demo dataset, Windows, not available in demo dataset, false, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, NULL, not available in demo dataset, not available in demo dataset, not available in demo dataset, desktop} |{Asia, Southern Asia, India, Maharashtra, (not set), Mumbai, not available in demo dataset, unknown.unknown, not available in demo dataset, not available in demo dataset, not available in demo dataset} |[{4, APAC}] |[{1, 0, 5, 14, NULL, true, true, true, https://analytics.google.com/analytics/web/, {/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com, Page Unavailable, NULL, NULL, /google+redesign/, /shop+by+brand/, /youtube, }, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, 0}, {NULL, true, NULL, NULL}, NULL, [], [], NULL, NULL, {0, 1, NULL}, [], NULL, [], [], [], PAGE, {NULL, NULL, NULL, NULL, (not set), NULL, No, : }, NULL, NULL, {(not set), Brands, (not set), (not set), (not set), (entrance), (entrance), (entrance), (entrance), (entrance), NULL, 1, NULL, NULL, NULL}, web, []}] |2474397855041322408|NULL |NULL |Referral |Not Socially Engaged|
|NULL |1 |1501616621|1501616621 |20170801|{1, 1, 1, NULL, 1, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1} |{/analytics/web/, (not set), analytics.google.com, referral, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, not available in demo dataset, NULL, NULL, NULL, NULL, NULL}, NULL, NULL}|{Chrome, not available in demo dataset, not available in demo dataset, Windows, not available in demo dataset, false, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, NULL, not available in demo dataset, not available in demo dataset, not available in demo dataset, desktop} |{Europe, Northern Europe, United Kingdom, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, as9105.com, not available in demo dataset, not available in demo dataset, not available in demo dataset} |[{4, EMEA}] |[{1, 0, 12, 43, NULL, true, true, true, https://analytics.google.com/analytics/web/?utm_source=demoaccount&utm_medium=demoaccount&utm_campaign=demoaccount, {/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com, Page Unavailable, NULL, NULL, /google+redesign/, /shop+by+brand/, /youtube, }, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, 0}, {NULL, true, NULL, NULL}, NULL, [], [], NULL, NULL, {0, 1, NULL}, [], NULL, [], [], [], PAGE, {NULL, NULL, NULL, NULL, (not set), NULL, No, : }, NULL, NULL, {(not set), Brands, (not set), (not set), (not set), (entrance), (entrance), (entrance), (entrance), (entrance), NULL, 1, NULL, NULL, NULL}, web, []}]|5870462820713110108|NULL |NULL |Referral |Not Socially Engaged|
|NULL |1 |1501601200|1501601200 |20170801|{1, 1, 1, NULL, 1, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1} |{/analytics/web/, (not set), analytics.google.com, referral, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, not available in demo dataset, NULL, NULL, NULL, NULL, NULL}, NULL, NULL}|{Firefox, not available in demo dataset, not available in demo dataset, Windows, not available in demo dataset, false, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, NULL, not available in demo dataset, not available in demo dataset, not available in demo dataset, desktop}|{Americas, Northern America, United States, Texas, Dallas-Ft. Worth TX, Dallas, not available in demo dataset, h5colo.com, not available in demo dataset, not available in demo dataset, not available in demo dataset} |[{4, North America}]|[{1, 0, 8, 26, NULL, true, true, true, https://analytics.google.com/analytics/web/, {/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com, Page Unavailable, NULL, NULL, /google+redesign/, /shop+by+brand/, /youtube, }, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, 0}, {NULL, true, NULL, NULL}, NULL, [], [], NULL, NULL, {0, 1, NULL}, [], NULL, [], [], [], PAGE, {NULL, NULL, NULL, NULL, (not set), NULL, No, : }, NULL, NULL, {(not set), Brands, (not set), (not set), (not set), (entrance), (entrance), (entrance), (entrance), (entrance), NULL, 1, NULL, NULL, NULL}, web, []}] |9397809171349480379|NULL |NULL |Referral |Not Socially Engaged|
|NULL |1 |1501615525|1501615525 |20170801|{1, 1, 1, NULL, 1, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1} |{/analytics/web/, (not set), adwords.google.com, referral, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, not available in demo dataset, NULL, NULL, NULL, NULL, NULL}, NULL, NULL} |{Chrome, not available in demo dataset, not available in demo dataset, Windows, not available in demo dataset, false, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, NULL, not available in demo dataset, not available in demo dataset, not available in demo dataset, desktop} |{Americas, Northern America, United States, not available in demo dataset, not available in demo dataset, not available in demo dataset, not available in demo dataset, (not set), not available in demo dataset, not available in demo dataset, not available in demo dataset}|[{4, North America}]|[{1, 0, 12, 25, NULL, true, true, true, https://adwords.google.com/analytics/web/?__o=cues&authuser=0, {/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com, Page Unavailable, NULL, NULL, /google+redesign/, /shop+by+brand/, /youtube, }, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, shop.googlemerchandisestore.com/google+redesign/shop+by+brand/youtube, 0}, {NULL, true, NULL, NULL}, NULL, [], [], NULL, NULL, {0, 1, NULL}, [], NULL, [], [], [], PAGE, {NULL, NULL, NULL, NULL, (not set), NULL, No, : }, NULL, NULL, {(not set), Brands, (not set), (not set), (not set), (entrance), (entrance), (entrance), (entrance), (entrance), NULL, 1, NULL, NULL, NULL}, web, []}] |6089902943184578335|NULL |NULL |Referral |Not Socially Engaged|
+---------+-----------+----------+--------------+--------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+------+--------+---------------+--------------------+
only showing top 5 rows
۵. جمعآوری دادهها بر اساس مرورگر دستگاه (معیارهای اساسی)
این کد دادههای گوگل آنالیتیکس را بر اساس مرورگر دستگاه جمعآوری میکند و معیارهای مختلفی مانند کل جلسات، بازدیدها، بازدیدها، تعداد بازدیدها، نرخ پرش، زمان حضور در سایت، بازدیدکنندگان منحصر به فرد و میانگین زمان هر بازدید را محاسبه میکند، سپس نام یک ستون را تغییر میدهد و نتایج را مرتب میکند.
print("Transformation 1: Aggregating by device browser...")
device_agg = ga_df.groupBy("device.browser") \
.agg(
count("*").alias("total_sessions"),
sum("totals.visits").alias("total_visits"),
sum("totals.hits").alias("total_hits"),
sum("totals.pageviews").alias("total_pageviews"),
sum("totals.bounces").alias("total_bounces"),
sum("totals.timeOnSite").alias("total_time_on_site"),
countDistinct("fullVisitorId").alias("unique_visitors"),
(sum("totals.timeOnSite")/sum("totals.visits")).alias("avg_time_per_visit")
) \
.withColumnRenamed("browser", "device_browser") \
.orderBy("total_sessions", ascending=False)
# Show sample transformed data
print("\nDevice Aggregation Sample:")
device_agg.show(5)
خروجی مورد انتظار:
Transformation 1: Aggregating by device browser... Device Aggregation Sample: +-----------------+--------------+------------+----------+---------------+-------------+------------------+---------------+------------------+ | device_browser|total_sessions|total_visits|total_hits|total_pageviews|total_bounces|total_time_on_site|unique_visitors|avg_time_per_visit| +-----------------+--------------+------------+----------+---------------+-------------+------------------+---------------+------------------+ | Chrome| 1900| 1900| 10896| 8956| 870| 354691| 1689|186.67947368421054| | Safari| 397| 397| 1260| 1137| 218| 43150| 364|108.69017632241814| | Firefox| 101| 101| 390| 343| 59| 10659| 95|105.53465346534654| |Internet Explorer| 54| 54| 107| 102| 36| 5589| 50| 103.5| | Edge| 23| 23| 63| 55| 12| 2623| 23|114.04347826086956| +-----------------+--------------+------------+----------+---------------+-------------+------------------+---------------+------------------+ only showing top 5 rows
۶. تحلیل منبع ترافیک با محاسبات درآمد
این کد دادههای گوگل آنالیتیکس را بر اساس منبع و رسانه ترافیک تجزیه و تحلیل میکند و معیارهایی مانند تعداد جلسات، تراکنشها، کل درآمد، درآمد به ازای هر جلسه و بازدیدکنندگان منحصر به فرد را محاسبه میکند، سپس نام ستونها را تغییر میدهد و نتایج را بر اساس کل درآمد مرتب میکند.
print("Transformation 2: Analyzing traffic sources...")
traffic_source_agg = ga_df.groupBy("trafficSource.source", "trafficSource.medium") \
.agg(
count("*").alias("session_count"),
sum(when(col("totals.transactions").isNotNull(), 1).otherwise(0)).alias("transactions"),
sum("totals.totalTransactionRevenue").cast(DecimalType(20,2)).alias("total_revenue"),
(sum("totals.totalTransactionRevenue")/count("*")).cast(DecimalType(10,2)).alias("revenue_per_session"),
countDistinct("fullVisitorId").alias("unique_visitors")
) \
.withColumnRenamed("source", "traffic_source") \
.withColumnRenamed("medium", "traffic_medium") \
.orderBy("total_revenue", ascending=False)
print("\nTraffic Source Aggregation Sample:")
traffic_source_agg.show(5)
خروجی مورد انتظار:
Transformation 2: Analyzing traffic sources... Traffic Source Aggregation Sample: +--------------------+--------------+-------------+------------+-------------+-------------------+---------------+ | traffic_source|traffic_medium|session_count|transactions|total_revenue|revenue_per_session|unique_visitors| +--------------------+--------------+-------------+------------+-------------+-------------------+---------------+ | (direct)| (none)| 2166| 42|8872040000.00| 4096048.01| 1943| | mail.google.com| referral| 2| 1| 17960000.00| 8980000.00| 2| | google.com.tw| referral| 1| 0| NULL| NULL| 1| |analytics.google.com| referral| 57| 0| NULL| NULL| 53| | quora.com| referral| 6| 0| NULL| NULL| 5| +--------------------+--------------+-------------+------------+-------------+-------------------+---------------+ only showing top 5 rows
۷. تحلیل جغرافیایی
این کد تجزیه و تحلیل جغرافیایی را بر روی دادههای گوگل آنالیتیکس بر اساس کشور و منطقه انجام میدهد، تعداد جلسات، کل بازدیدهای صفحه، کل زمان حضور در سایت، میانگین زمان هر جلسه و بازدیدکنندگان منحصر به فرد را محاسبه میکند، سپس ستونها را تغییر نام میدهد و بر اساس تعداد جلسات مرتب میکند.
print("Transformation 3: Geographic analysis...")
geo_agg = ga_df.groupBy("geoNetwork.country", "geoNetwork.region") \
.agg(
count("*").alias("session_count"),
sum("totals.pageviews").alias("total_pageviews"),
sum("totals.timeOnSite").alias("total_time_on_site"),
(sum("totals.timeOnSite")/count("*")).alias("avg_time_per_session"),
countDistinct("fullVisitorId").alias("unique_visitors")
) \
.withColumnRenamed("country", "country") \
.withColumnRenamed("region", "region") \
.orderBy("session_count", ascending=False)
print("\nGeographic Aggregation Sample:")
geo_agg.show(5)
خروجی مورد انتظار:
Transformation 3: Geographic analysis... Geographic Aggregation Sample: +--------------+--------------------+-------------+---------------+------------------+--------------------+---------------+ | country| region|session_count|total_pageviews|total_time_on_site|avg_time_per_session|unique_visitors| +--------------+--------------------+-------------+---------------+------------------+--------------------+---------------+ | United States|not available in ...| 564| 2326| 97829| 173.45567375886526| 494| | United States| California| 420| 3102| 116563| 277.5309523809524| 347| | United States| New York| 109| 845| 39976| 366.7522935779817| 84| |United Kingdom|not available in ...| 82| 161| 7791| 95.01219512195122| 79| | India|not available in ...| 62| 139| 2869| 46.274193548387096| 61| +--------------+--------------------+-------------+---------------+------------------+--------------------+---------------+ only showing top 5 rows
۸. تحلیل مبتنی بر زمان
این کد با استخراج ساعت از ستون visitStartTime ، تجزیه و تحلیل مبتنی بر زمان را انجام میدهد، سپس دادهها را بر اساس ساعت گروهبندی میکند تا تعداد جلسات، تراکنشها، کل درآمد و کل بازدیدهای صفحه را برای هر ساعت محاسبه کند و در نهایت نتایج را بر اساس ساعت مرتب کند.
print("Transformation 4: Time-based analysis...")
hourly_agg = ga_df.withColumn("hour", date_format(col("visitStartTime").cast("timestamp"), "H")) \
.groupBy("hour") \
.agg(
count("*").alias("session_count"),
sum("totals.transactions").alias("transactions"),
sum("totals.totalTransactionRevenue").cast(DecimalType(20,2)).alias("total_revenue"),
sum("totals.pageviews").alias("total_pageviews")
) \
.orderBy("hour")
print("\nHourly Aggregation Sample:")
hourly_agg.show(5)
خروجی مورد انتظار:
Transformation 4: Time-based analysis... Hourly Aggregation Sample: +----+-------------+------------+-------------+---------------+ |hour|session_count|transactions|total_revenue|total_pageviews| +----+-------------+------------+-------------+---------------+ | 0| 87| NULL| NULL| 372| | 1| 102| NULL| NULL| 494| | 10| 67| NULL| NULL| 149| | 11| 73| NULL| NULL| 167| | 12| 99| NULL| NULL| 313| +----+-------------+------------+-------------+---------------+ only showing top 5 rows
۹. نوشتن نتیجه در جدول BigQuery
این کد چهار فریم داده تجمیعشده ( device_agg ، traffic_source_agg ، geo_agg و hourly_agg ) را برای جدا کردن جداول در Google BigQuery صادر میکند و در صورت وجود، جداول موجود را با استفاده از یک روش نوشتن مستقیم، بازنویسی میکند.
# Write to BigQuery tables
print("\nLoading data to BigQuery...")
# Set output tables
device_output_table = f"{project_id}.analytics_sample.device_aggregation"
traffic_output_table = f"{project_id}.analytics_sample.traffic_source_aggregation"
geo_output_table = f"{project_id}.analytics_sample.geo_aggregation"
hourly_output_table = f"{project_id}.analytics_sample.hourly_aggregation"
dataset_id = "demo" # Replace with your BigQuery dataset ID
# Set BigQuery output table
device_output_table = f"{project_id}.{dataset_id}.device_aggregation"
traffic_output_table = f"{project_id}.{dataset_id}.traffic_source_aggregation"
geo_output_table = f"{project_id}.{dataset_id}.geo_aggregation"
hourly_output_table = f"{project_id}.{dataset_id}.hourly_aggregation"
# Write each DataFrame to BigQuery
device_agg.write \
.format("bigquery") \
.option("table", device_output_table) \
.option("writeMethod", "direct") \
.mode("overwrite") \
.save()
traffic_source_agg.write \
.format("bigquery") \
.option("table", traffic_output_table) \
.option("writeMethod", "direct") \
.mode("overwrite") \
.save()
geo_agg.write \
.format("bigquery") \
.option("table", geo_output_table) \
.option("writeMethod", "direct") \
.mode("overwrite") \
.save()
hourly_agg.write \
.format("bigquery") \
.option("table", hourly_output_table) \
.option("writeMethod", "direct") \
.mode("overwrite") \
.save()
جدول خروجی را در BigQuery بررسی کنید تا مطمئن شوید دادهها پس از انجام برخی تبدیلها با موفقیت ذخیره شدهاند.

جدول device_aggregation

جدول geo_aggregation

جدول hourly_aggregation

تجمیع_منبع_ترافیک

۱۰. هماهنگسازی کد نوتبوک BigQuery Studio (اختیاری)
شما میتوانید کد نوتبوک BigQuery Studio را به روشهای زیر تنظیم کنید:
- کد نوتبوک زمانبندیشده از کنسول گوگل کلود ( قیمت نوتبوک اعمال میشود).
- کد نوتبوک را به عنوان یک بار کاری دستهای Dataproc Serverless اجرا کنید ( قیمتگذاری Dataproc Serverless اعمال میشود).
در این آزمایشگاه کد، از کد Schedule notebook از کنسول Google Cloud استفاده خواهیم کرد.
- در نوار ابزار دفترچه یادداشت ، روی «زمانبندی» کلیک کنید.
- در پنل «دفترچه برنامهریزی» ، در فیلد «نام برنامهریزی» ، نامی برای برنامهریزی وارد کنید.
- در بخش احراز هویت ، نوتبوک را با استفاده از اطلاعات کاربری حساب گوگل یا یک حساب سرویس، مجاز کنید.
- برای استفاده از اطلاعات کاربری حساب گوگل خود ( پیشنمایش )، گزینه «اجرا با اطلاعات کاربری من» را انتخاب کنید.
- برای استفاده از یک حساب سرویس، گزینهی «اجرا با حساب سرویس انتخابشده» را انتخاب کنید، سپس یک حساب سرویس انتخاب کنید.
- در بخش گزینههای دفترچه یادداشت ، در فیلد الگوی زمان اجرا ، یک الگوی زمان اجرای دفترچه یادداشت Colab یا مشخصات زمان اجرای پیشفرض را انتخاب کنید. برای جزئیات بیشتر در مورد ایجاد الگوی زمان اجرای دفترچه یادداشت Colab، به ایجاد الگوی زمان اجرا مراجعه کنید.
- در فیلد «سطل ذخیرهسازی ابری» ، روی «مرور» کلیک کنید و یک سطل ذخیرهسازی ابری انتخاب یا ایجاد کنید. حساب سرویس انتخابشده باید نقش IAM « مدیر ذخیرهسازی» (
roles/storage.admin) را در سطل انتخابشده داشته باشد. برای اطلاعات بیشتر، به «فعال کردن زمانبندی نوتبوک» مراجعه کنید. - در بخش «فرکانس زمانبندی» ، موارد زیر را انجام دهید:
- در منوی تکرارها ، تعداد دفعات اجرای برنامهریزیشدهی نوتبوک را انتخاب کنید.
- در فیلد «زمان» ، زمان اجرای برنامهریزیشدهی نوتبوک را وارد کنید.
- در منوی منطقه زمانی ، منطقه زمانی مورد نظر برای برنامه را انتخاب کنید.
- روی ایجاد برنامه کلیک کنید. اگر برای روش احراز هویت خود، گزینه «اجرا با اعتبارنامههای کاربری من» را انتخاب کردهاید، باید حساب گوگل خود را تأیید کنید ( پیشنمایش ).

۱۱. تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آزمایشگاه کد، این مراحل را دنبال کنید:
- در کنسول گوگل کلود، به صفحه مدیریت منابع بروید.
- در لیست پروژهها، پروژهای را که میخواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
- در کادر محاورهای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.
۱۲. تبریک
شما تبدیل دادهها و تحلیل آنها را با استفاده از apache spark serverless در BigQuery Studio Notebooks به پایان رساندهاید. در طول مسیر، مجموعه دادههای عمومی Google Cloud را بررسی کردهاید، ETL serverless را با apache spark در BigQuery Studio Notebook و Orchestrated BigQuery Studio Notebook انجام دادهاید. کارتان فوقالعاده بود!
مراحل بعدی:
- نوتبوک را با استفاده از حساب سرویس برای اهداف اتوماسیون هماهنگ کنید.
- اسکریپتی برای نظارت بر مدت زمان اجرای کار ETL اضافه کنید.
- یک دفترچه یادداشت نصب کنید.
- از DataprocSparkSession برای بهرهبرداری از قابلیتهای توزیعشدهی واقعی آپاچی اسپارک با Serverless Dataproc در BigQuery Studio Notebooks استفاده کنید.
- ایجاد روال ذخیره شده برای آپاچی اسپارک در BigQuery Studio. به این ترتیب میتوانید اصول OOP را برای ساختاردهی کد PySpark خود اعمال کنید تا سازماندهی، قابلیت استفاده مجدد و قابلیت نگهداری بهتری داشته باشید.
مراجع :