تبدیل داده های بدون سرور با اسپارک آپاچی در نوت بوک های استودیو BigQuery

1. مقدمه

در این کد لبه، یاد خواهید گرفت که چگونه از قدرت Apache Spark برای تبدیل داده ها در رابط آشنا BigQuery Studio استفاده کنید. داده‌ها را از BigQuery می‌خوانید، پاکسازی و تبدیل داده‌ها را با استفاده از PySpark انجام می‌دهید، و نتایج را در یک جدول جدید BigQuery باز می‌نویسید، همه از یک نوت بوک.

از طریق کد لبه، شما یک رویکرد گام به گام را به شرح زیر به کار خواهید گرفت:

  1. پروژه Google Cloud خود را آماده کنید و تمام API مورد نیاز را روی آن فعال کنید
  2. سطل GCS برای پوشه موقت ایجاد کنید
  3. کتابخانه های مورد نیاز را برای اجرای اسپارک آپاچی وارد کنید
  4. جلسه Spark را با رابط BigQuery راه اندازی کنید
  5. نمونه داده Google Analytics را از BigQuery Public Dataset بخوانید
  6. با مرورگر دستگاه، داده‌ها را با داده‌های انبوه تبدیل کنید (سنجه‌های اساسی)
  7. داده ها را با تجزیه و تحلیل منبع ترافیک با محاسبات درآمد تغییر دهید
  8. داده ها را با تجزیه و تحلیل جغرافیایی تبدیل کنید
  9. داده ها را پس از تبدیل به جدول BigQuery بنویسید

نمای کلی معماری

186f332da87c2ef3.png

پیش نیازها

  • یک پروژه Google Cloud Platform (GCP) با فعال کردن صورت‌حساب.
  • BigQuery API و BigQuery Connection API در پروژه GCP شما فعال شده است.
  • دانش اولیه SQL و Python.

چیزی که یاد خواهید گرفت

  • نحوه استخراج داده ها با استفاده از اسپارک آپاچی در نوت بوک BigQuery Studio
  • نحوه تبدیل یا تجمیع داده ها با استفاده از اسپارک آپاچی در نوت بوک استودیو BigQuery
  • نحوه نوشتن داده ها پس از تبدیل یا جمع آوری داده ها با استفاده از اسپارک آپاچی در نوت بوک استودیو BigQuery

آنچه شما نیاز دارید

  • مرورگر وب کروم
  • یک اکانت جیمیل
  • یک پروژه Cloud با فعال کردن صورت‌حساب

2. راه اندازی اولیه و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

fbef9caa1602edd0.png

97bdebccea2ba4be.png

5e3ff691252acf41.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، مقدار سومی وجود دارد، Project Number که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

3. قبل از شروع

فعال کردن API

قبل از استفاده از نوت بوک های BigQuery Studio، باید API های زیر را فعال کنیم:

  • API موتور محاسباتی
  • API Dataform
  • Vertex AI API

برای فعال کردن دستی، به Bigquery بروید. در نوار برگه پنجره ویرایشگر، روی پیکان کشویی کنار علامت + کلیک کنید، نشانگر را روی Notebook نگه دارید و سپس الگوی BigQuery یا Empty Notebook یا Spark template را انتخاب کنید.

2073fec24366e7c4.png

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

44dc4e398b4e8fb5.png

پس از اتمام، فعال کنید و روی Close کلیک کنید. لطفاً برای جزئیات بیشتر به Enable BigQuery Studio برای مدیریت دارایی مراجعه کنید

4. یک مجموعه داده عمومی را بخوانید

ابتدا یک سطل GCS برای استفاده موقت ایجاد می کنیم تا بتوان جرقه را در نوت بوک های BigQuery Studio اجرا کرد.

  1. در Google Cloud Console، به BigQuery بروید
  2. در نوار برگه پنجره ویرایشگر، روی پیکان کشویی کنار علامت + کلیک کنید، نشانگر را روی Notebook نگه دارید و سپس Empty Notebook را انتخاب کنید. dc05f38b85ba6844.png
  3. روی سلول کد کلیک کنید سپس اسکریپت cli را در زیر تایپ کنید تا سطل GCS ایجاد شود سپس روی دکمه Run cell کلیک کنید یا Shift + Enter را فشار دهید.
!gsutil mb -p <your_project_id> -c STANDARD -l US gs://ioxid2025-<your_project_id>

مقادیر <your_project_id> را مطابق با آنچه که هنگام ایجاد پروژه Google Cloud انتخاب کرده اید، به روز کنید. برای ایجاد نام سطل منحصر به فرد GCS، مقادیر <your_project_id> را با شناسه پروژه خود به روز کنید. سپس روی دکمه Run cell کلیک کنید یا Shift + Enter را فشار دهید تا سلول کد اجرا شود

سپس در مرحله بعد، یک جلسه جرقه را آغاز خواهیم کرد. در این کد لبه، از کتابخانه SparkSession استفاده خواهیم کرد، اگرچه می‌توانیم از DataprocSession برای استفاده از قابلیت‌های dataproc برای اجرای spark در نوت‌بوک BigQuery Studio استفاده کنیم.

  1. روی سلول کد کلیک کنید سپس اسکریپت cli را در زیر تایپ کنید تا جلسه اسپارک شروع شود. روی دکمه 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
  1. روی سلول کد کلیک کنید سپس اسکریپت 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)

پایگاه داده نمونه گوگل آنالیتیکس

پایگاه داده نمونه Google Analytics در BigQuery از طریق برنامه داده عمومی Google Cloud ارائه می شود. این مجموعه داده 12 ماه (اوت 2016 تا آگوست 2017) داده های مبهم Google Analytics 360 را از Google Merchandise Store ، یک فروشگاه تجارت الکترونیک واقعی که کالاهای با مارک Google را می فروشد، در BigQuery ارائه می دهد. این یک روش عالی برای تجزیه و تحلیل داده های کسب و کار و یادگیری مزایای استفاده از BigQuery برای تجزیه و تحلیل داده های Analytics 360 است درباره داده ها بیشتر بدانید

داده ها شامل داده هایی است که یک وب سایت تجارت الکترونیک می بیند و شامل اطلاعات زیر است:

  • داده‌های منبع ترافیک: اطلاعاتی در مورد مکان بازدیدکنندگان وب‌سایت، از جمله داده‌های مربوط به ترافیک ارگانیک، ترافیک جستجوی پولی، و ترافیک نمایشی
  • داده های محتوا: اطلاعاتی در مورد رفتار کاربران در سایت، مانند URL صفحاتی که بازدیدکنندگان به آن نگاه می کنند، نحوه تعامل آنها با محتوا و غیره.
  • داده های تراکنش: اطلاعات مربوط به تراکنش های موجود در وب سایت فروشگاه کالای Google.

کد زیر را اجرا کنید تا نمونه 5 داده برتر در اسپارک آپاچی نمایش داده شود

# 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

5. داده‌ها را بر اساس مرورگر دستگاه جمع‌آوری کنید (سنجه‌های اساسی)

این کد داده‌های Google Analytics را بر اساس مرورگر دستگاه جمع‌آوری می‌کند، معیارهای مختلفی مانند کل جلسات، بازدیدها، بازدیدها، بازدید از صفحه، پرش، زمان حضور در سایت، بازدیدکنندگان منحصربه‌فرد و میانگین زمان در هر بازدید را محاسبه می‌کند، سپس نام یک ستون را تغییر می‌دهد و نتایج را مرتب می‌کند.

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

6. تجزیه و تحلیل منبع ترافیک با محاسبات درآمد

این کد داده های Google Analytics را بر اساس منبع ترافیک و رسانه تجزیه و تحلیل می کند، معیارهایی مانند تعداد جلسات، تراکنش ها، درآمد کل، درآمد هر جلسه و بازدیدکنندگان منحصر به فرد را محاسبه می کند، سپس نام ستون ها را تغییر می دهد و نتایج را بر اساس درآمد کل مرتب می کند.

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

7. تحلیل جغرافیایی

این کد تجزیه و تحلیل جغرافیایی داده‌های Google Analytics را بر اساس کشور و منطقه انجام می‌دهد، تعداد جلسات، تعداد بازدید از صفحه، کل زمان در سایت، میانگین زمان در هر جلسه و بازدیدکنندگان منحصر به فرد را محاسبه می‌کند، سپس ستون‌ها را تغییر نام داده و بر اساس تعداد جلسات مرتب می‌کند.

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

8. تجزیه و تحلیل مبتنی بر زمان

این کد با استخراج ساعت از ستون 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

9. نتیجه را در جدول 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 بررسی کنید تا مطمئن شوید پس از انجام تغییراتی، داده ها با موفقیت ذخیره شده اند

6227a951f1d1d4e6.png

جدول تجمیع دستگاه

da7791f5d15f67be.png

جدول geo_Aggregation

76ec9d9dc9929c1c.png

جدول تجمع ساعتی

bcf627ef6a13c8cc.png

traffic_source_agregation

f373d64ace332074.png

10. کد نوت بوک استودیو BigQuery را هماهنگ کنید (اختیاری)

می‌توانید کد نوت‌بوک BigQuery Studio را به روش‌های زیر هماهنگ کنید:

در این لبه کد، از کد نوت بوک Schedule از کنسول Google Cloud استفاده می کنیم.

  1. در نوار ابزار Notebook ، روی زمانبندی کلیک کنید.
  2. در قسمت Schedule Notebook ، در قسمت Schedule name ، نامی را برای زمانبندی وارد کنید.
  3. در بخش احراز هویت ، دفترچه یادداشت را با اعتبار کاربری حساب Google یا حساب سرویس خود تأیید کنید.
  4. برای استفاده از اعتبار کاربری حساب Google خود ( پیش نمایشExecute with my user credentials را انتخاب کنید.
  5. برای استفاده از یک حساب سرویس، اجرا با حساب سرویس انتخاب شده را انتخاب کنید، سپس یک حساب سرویس را انتخاب کنید.
  6. در قسمت گزینه های Notebook ، در قسمت Runtime template ، یک الگوی زمان اجرا نوت بوک Colab یا مشخصات پیش فرض زمان اجرا را انتخاب کنید. برای جزئیات در مورد ایجاد یک الگوی زمان اجرا نوت بوک Colab، به ایجاد یک الگوی زمان اجرا مراجعه کنید.
  7. در قسمت Cloud Storage سطل ، روی Browse کلیک کنید و یک سطل Cloud Storage را انتخاب یا ایجاد کنید. به حساب سرویس انتخابی باید نقش Storage Admin ( roles/storage.admin ) IAM در سطل انتخابی داده شود. برای اطلاعات بیشتر، فعال کردن زمان‌بندی نوت‌بوک را ببینید.
  8. در قسمت زمانبندی فرکانس موارد زیر را انجام دهید:
  9. در منوی Repeats ، تعداد دفعات اجرای نوت بوک برنامه ریزی شده را انتخاب کنید.
  10. در فیلد در زمان ، زمان اجرای برنامه ریزی شده نوت بوک را وارد کنید.
  11. در منوی Timezone ، منطقه زمانی برنامه را انتخاب کنید.
  12. روی ایجاد برنامه زمانی کلیک کنید. اگر اجرای با اعتبار کاربری من را برای روش احراز هویت خود انتخاب کرده اید، باید حساب Google خود را تأیید کنید ( پیش نمایش ).

f3d87c9a3408b08d.png

11. پاکسازی کنید

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع مورد استفاده در این Codelab، این مراحل را دنبال کنید:

  1. در کنسول Google Cloud، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
  3. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.

12. تبریک می گویم

شما با استفاده از apache sparkless serverless در BigQuery Studio Notebook، تبدیل و تجزیه و تحلیل داده ها را به پایان رسانده اید. در طول مسیر، مجموعه داده های عمومی Google Cloud را کاوش کرده اید، ETL بدون سرور را با جرقه آپاچی در نوت بوک BigQuery Studio و Orchestrated BigQuery Studio Notebook انجام داده اید. کار خارق العاده!

مراحل بعدی:

  • نوت بوک را با استفاده از حساب سرویس برای اهداف اتوماسیون هماهنگ کنید.
  • هنگام اجرای کار ETL، اسکریپت را برای مدت زمان نظارت اضافه کنید.
  • یک نوت بوک مستقر کنید.
  • از DataprocSparkSession برای استفاده از قابلیت‌های اسپارک آپاچی توزیع‌شده واقعی با Dataproc بدون سرور در نوت‌بوک‌های BigQuery Studio استفاده کنید.
  • رویه ذخیره شده را برای Apache Spark در BigQuery Studio ایجاد کنید. این روش می تواند اصول OOP را برای ساختار کد PySpark شما برای سازماندهی، قابلیت استفاده مجدد و نگهداری بهتر اعمال کند.

مراجع :