שימוש ב-BigQuery עם #C

1. סקירה כללית

‫BigQuery הוא מחסן נתונים לצורכי ניתוח מנוהל במלואו של Google, בקנה מידה של פטה-בייט ובעלות נמוכה. ‫BigQuery הוא NoOps – אין תשתית לניהול ולא צריך מנהל מסד נתונים – כך שאתם יכולים להתמקד בניתוח נתונים כדי למצוא תובנות משמעותיות, להשתמש ב-SQL מוכר ולנצל את היתרונות של המודל שלנו של תשלום לפי שימוש.

ב-codelab הזה תשתמשו ב-Google Cloud Client Libraries for .NET כדי לשלוח שאילתות למערכי נתונים ציבוריים ב-BigQuery באמצעות C#‎.

מה תלמדו

  • איך משתמשים ב-Cloud Shell
  • איך מפעילים את BigQuery API
  • איך מאמתים בקשות API
  • איך מתקינים את ספריית הלקוח של Google Cloud ל-C#‎
  • איך שואלים שאילתות לגבי יצירות של שייקספיר
  • איך שולחים שאילתות לקבוצת הנתונים של GitHub
  • איך משנים את הגדרות השמירה במטמון ומציגים נתונים סטטיסטיים

מה תצטרכו

  • פרויקט ב-Google Cloud Platform
  • דפדפן, כמו Chrome או Firefox
  • היכרות עם השימוש ב-C#‎

סקר

איך תשתמשו במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים

איך היית מדרג את חוויית השימוש שלך ב-C#?

מתחילים בינוני מומחה

איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותים של Google Cloud Platform?

מתחילים ביניים מומחים

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

295004821bab6a87.png37d264871000675d.png96d86d3d5655cdbe.png

  • שם הפרויקט הוא השם המוצג למשתתפים בפרויקט. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא נשארת לאורך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על שלושת הערכים האלה מופיע במאמרי העזרה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים עם תיאור של השירות. אם מוצג לכם מסך ביניים, לוחצים על המשך.

d95252b003979716.png

יחלפו כמה רגעים עד שההקצאה והחיבור ל-Cloud Shell יושלמו.

7833d5e1c5d18f54.png

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות של הרשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן.

אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות ושהפרויקט מוגדר לפי מזהה הפרויקט.

  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שאתם מאומתים:
gcloud auth list

פלט הפקודה

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט:
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

אם לא, אפשר להגדיר אותו באמצעות הפקודה הזו:

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

3. הפעלת BigQuery API

‫BigQuery API אמור להיות מופעל כברירת מחדל בכל פרויקט ב-Google Cloud. כדי לבדוק אם זה נכון, מריצים את הפקודה הבאה ב-Cloud Shell: אתם אמורים להופיע ברשימה של BigQuery:

gcloud services list

האפשרות BigQuery אמורה להופיע ברשימה:

NAME                              TITLE
bigquery-json.googleapis.com      BigQuery API
...

אם BigQuery API לא מופעל, אפשר להשתמש בפקודה הבאה ב-Cloud Shell כדי להפעיל אותו:

gcloud services enable bigquery-json.googleapis.com

4. התקנה של ספריית הלקוח של BigQuery ל-C#‎

קודם צריך ליצור אפליקציית קונסולה פשוטה ב-C# ‎ שתשמש להרצת דוגמאות ל-BigQuery API.

dotnet new console -n BigQueryDemo

אמורה להופיע האפליקציה שנוצרה והתלות שנפתרה:

The template "Console Application" was created successfully.
Processing post-creation actions...
...
Restore succeeded.

לאחר מכן, עוברים לתיקייה BigQueryDemo:

cd BigQueryDemo

מוסיפים את חבילת NuGet‏ Google.Cloud.BigQuery.V2 לפרויקט:

dotnet add package Google.Cloud.BigQuery.V2
info : Adding PackageReference for package 'Google.Cloud.BigQuery.V2' into project '/home/atameldev/BigQueryDemo/BigQueryDemo.csproj'.
log  : Restoring packages for /home/atameldev/BigQueryDemo/BigQueryDemo.csproj...
...
info : PackageReference for package 'Google.Cloud.BigQuery.V2' version '1.2.0' added to file '/home/atameldev/BigQueryDemo/BigQueryDemo.csproj'.

עכשיו אתם מוכנים להשתמש ב-BigQuery API.

5. שליחת שאילתות לגבי יצירות של שייקספיר

מערך נתונים ציבורי הוא כל מערך נתונים שמאוחסן ב-BigQuery וזמין לציבור הרחב. יש עוד הרבה מערכי נתונים ציבוריים שאפשר להריץ עליהם שאילתות. חלק מהם מתארחים גם ב-Google, אבל הרבה יותר מתארחים אצל צדדים שלישיים. אפשר לקרוא מידע נוסף בדף מערכי נתונים ציבוריים.

בנוסף למערכי הנתונים הציבוריים, BigQuery מספק מספר מוגבל של טבלאות לדוגמה שאפשר להריץ עליהן שאילתות. הטבלאות האלה מופיעות ב-bigquery-public-data:samples dataset. אחת מהטבלאות האלה נקראת shakespeare. היא מכילה אינדקס מילים של יצירות שייקספיר, עם מספר הפעמים שכל מילה מופיעה בכל אוסף.

בשלב הזה, תריצו שאילתה בטבלת שייקספיר.

קודם פותחים את עורך הקוד בפינה השמאלית העליונה של Cloud Shell:

fd3fc1303e63572.png

עוברים לקובץ Program.cs בתיקייה BigQueryDemo ומחליפים את הקוד בקוד הבא. חשוב להקפיד להחליף את projectId במזהה הפרויקט האמיתי:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = BigQueryClient.Create("projectId");
            var table = client.GetTable("bigquery-public-data", "samples", "shakespeare");
            var sql = $"SELECT corpus AS title, COUNT(word) AS unique_words FROM {table} GROUP BY title ORDER BY unique_words DESC LIMIT 10";

            var results = client.ExecuteQuery(sql, parameters: null);

            foreach (var row in results)
            {
                Console.WriteLine($"{row["title"]}: {row["unique_words"]}");
            }
        }
    }
}

כדאי להקדיש דקה או שתיים כדי לבדוק את הקוד ולראות איך מתבצעת השאילתה בטבלה.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

dotnet run

תוצג רשימה של מילים והמופעים שלהן:

hamlet: 5318
kinghenryv: 5104
cymbeline: 4875
troilusandcressida: 4795
kinglear: 4784
kingrichardiii: 4713
2kinghenryvi: 4683
...

6. הרצת שאילתות במערך הנתונים של GitHub

כדי להכיר טוב יותר את BigQuery, עכשיו נריץ שאילתה על מערך נתונים ציבורי של GitHub. אפשר למצוא את הודעות הקומיט הנפוצות ביותר ב-GitHub. תשתמשו גם במסוף האינטרנט של BigQuery כדי להציג תצוגה מקדימה של שאילתות אד-הוק ולהריץ אותן.

כדי לראות איך הנתונים נראים, פותחים את מערך הנתונים של GitHub בממשק המשתמש באינטרנט של BigQuery:

https://console.cloud.google.com/bigquery?p=bigquery-public-data&d=github_repos&t=commits&page=table

כדי לראות תצוגה מקדימה של הנתונים, לוחצים על הלחצן Preview (תצוגה מקדימה):

f706bfe3dfcbd267.png

עוברים לקובץ Program.cs בתיקייה BigQueryDemo ומחליפים את הקוד בקוד הבא. חשוב להקפיד להחליף את projectId במזהה הפרויקט האמיתי:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = BigQueryClient.Create("projectId");
            var table = client.GetTable("bigquery-public-data", "github_repos", "commits");
            
            var sql = $"SELECT subject AS subject, COUNT(*) AS num_duplicates FROM {table} GROUP BY subject ORDER BY num_duplicates DESC LIMIT 10";

            var results = client.ExecuteQuery(sql, parameters: null);

            foreach (var row in results)
            {
                Console.WriteLine($"{row["subject"]}: {row["num_duplicates"]}");
            }
        }
    }
}

כדאי להקדיש דקה או שתיים ללימוד הקוד ולראות איך מתבצעת שאילתה בטבלה כדי למצוא את הודעות השליחה הנפוצות ביותר.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

dotnet run

אמורה להופיע רשימה של הודעות על ביצוע שינויים (commit) והמופעים שלהן:

Update README.md: 2509242
: 1971725
Initial commit: 1942149
Mirroring from Micro.blog.: 838586
update: 575188
Update data.json: 548651
Update data.js: 548339
Add files via upload: 379941
*** empty log message ***: 358528
Can't you see I'm updating the time?: 286863

7. שמירה במטמון ונתונים סטטיסטיים

אחרי השאילתה הראשונית, BigQuery שומר במטמון את התוצאות. כתוצאה מכך, השאילתות הבאות ייקחו הרבה פחות זמן. אפשר להשבית את השמירה במטמון באמצעות אפשרויות שאילתה. ב-BigQuery מתבצע גם מעקב אחרי נתונים סטטיסטיים מסוימים לגבי השאילתות, כמו זמן היצירה, זמן הסיום והמספר הכולל של בייטים שעברו עיבוד.

בשלב הזה משביתים את השמירה במטמון ומציגים נתונים סטטיסטיים לגבי השאילתות.

עוברים לקובץ Program.cs בתיקייה BigQueryDemo ומחליפים את הקוד בקוד הבא. חשוב להקפיד להחליף את projectId במזהה הפרויקט האמיתי:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = BigQueryClient.Create("projectId");
            var table = client.GetTable("bigquery-public-data", "github_repos", "commits");
            
            var sql = $"SELECT subject AS subject, COUNT(*) AS num_duplicates FROM {table} GROUP BY subject ORDER BY num_duplicates DESC LIMIT 10";
            var queryOptions = new QueryOptions {
                UseQueryCache = false
            };

            var results = client.ExecuteQuery(sql, parameters: null, queryOptions: queryOptions);

            foreach (var row in results)
            {
                Console.WriteLine($"{row["subject"]}: {row["num_duplicates"]}");
            }

            var job = client.GetJob(results.JobReference);
            var stats = job.Statistics;
            Console.WriteLine("----------");
            Console.WriteLine($"Creation time: {stats.CreationTime}");
            Console.WriteLine($"End time: {stats.EndTime}");
            Console.WriteLine($"Total bytes processed: {stats.TotalBytesProcessed}");
        }
    }
}

כמה דברים שכדאי לדעת על הקוד. קודם כל, משביתים את השמירה במטמון על ידי הוספת אפשרויות לשאילתה והגדרת UseQueryCache כ-false. שנית, ניגשתם לנתונים הסטטיסטיים לגבי השאילתה מאובייקט המשרה.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

dotnet run

כמו קודם, תופיע רשימה של הודעות על ביצוע שינויים והמופעים שלהן. בנוסף, בסוף השאילתה אמורים להופיע נתונים סטטיסטיים לגביה

Update README.md: 2509242
: 1971725
Initial commit: 1942149
Mirroring from Micro.blog.: 838586
update: 575188
Update data.json: 548651
Update data.js: 548339
Add files via upload: 379941
*** empty log message ***: 358528
Can't you see I'm updating the time?: 286863
----------
Creation time: 1533052057398
End time: 1533052066961
Total bytes processed: 9944197093

8. טעינת נתונים ל-BigQuery

אם רוצים להריץ שאילתות על נתונים משלכם, צריך קודם לטעון את הנתונים ל-BigQuery. ‫BigQuery תומך בטעינת נתונים ממקורות רבים, כמו Google Cloud Storage, שירותים אחרים של Google ומקור שניתן לקריאה. אפשר אפילו להזרים את הנתונים באמצעות הוספות של נתונים בהזרמה. מידע נוסף זמין במאמר בנושא טעינת נתונים לתוך BigQuery.

בשלב הזה תטענו קובץ JSON שמאוחסן ב-Google Cloud Storage לטבלה ב-BigQuery. קובץ ה-JSON נמצא במיקום gs://cloud-samples-data/bigquery/us-states/us-states.json

אם אתם רוצים לדעת מה התוכן של קובץ ה-JSON, אתם יכולים להשתמש בכלי gsutil של שורת הפקודה כדי להוריד אותו ב-Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .
Copying gs://cloud-samples-data/bigquery/us-states/us-states.json...
/ [1 files][  2.0 KiB/  2.0 KiB]                                                
Operation completed over 1 objects/2.0 KiB.

אפשר לראות שהוא מכיל את רשימת המדינות בארה"ב, וכל מדינה היא מסמך JSON בשורה נפרדת:

less us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

כדי לטעון את קובץ ה-JSON הזה ל-BigQuery, עוברים לקובץ Program.cs בתיקייה BigQueryDemo ומחליפים את הקוד בקוד הבא. חשוב להקפיד להחליף את projectId במזהה הפרויקט האמיתי:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var gcsUri = "gs://cloud-samples-data/bigquery/us-states/us-states.json";
            var client = BigQueryClient.Create("projectId");
            var dataset = client.GetOrCreateDataset("us_states_dataset");

            var schema = new TableSchemaBuilder 
            {
                { "name", BigQueryDbType.String },
                { "post_abbr", BigQueryDbType.String }
            }.Build();

            var jobOptions = new CreateLoadJobOptions
            {
                SourceFormat = FileFormat.NewlineDelimitedJson
            };

            var table = dataset.GetTableReference("us_states_table");
            var loadJob = client.CreateLoadJob(gcsUri, table, schema, jobOptions);

            loadJob.PollUntilCompleted();
            loadJob.ThrowOnAnyError();
            Console.WriteLine("Json file loaded to BigQuery");
        }
    }
}

כדאי להקדיש דקה או שתיים כדי להבין איך הקוד טוען את קובץ ה-JSON ויוצר טבלה עם סכימה מתחת למערך נתונים.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

dotnet run

מערך נתונים וטבלה נוצרים ב-BigQuery

Json file loaded to BigQuery

כדי לוודא שמערך הנתונים אכן נוצר, אפשר לעבור אל מסוף BigQuery. אמורים לראות מערך נתונים חדש וטבלה שנוצרו. אם עוברים לכרטיסיית התצוגה המקדימה של הטבלה, אפשר לראות את הנתונים בפועל:

7d9f7c493acbbf9a.png

9. מעולה!

למדתם איך להשתמש ב-BigQuery באמצעות C#‎.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud Platform על המשאבים שבהם השתמשתם במדריך למתחילים הזה:

  • עוברים אל Cloud Platform Console.
  • בוחרים את הפרויקט שרוצים לסגור ולוחצים על 'מחיקה' בחלק העליון. הפעולה הזו מתזמנת את הפרויקט למחיקה.

מידע נוסף

רישיון

העבודה הזו בשימוש במסגרת רישיון Creative Commons שמותנה בייחוס כללי מגרסה 2.0.