將 Databricks 連結至 BigQuery

本教學課程說明如何連結 BigQuery 資料表或檢視區塊,以便從 Databricks 筆記本讀取及寫入資料。以下步驟說明如何使用 Google Cloud 控制台Databricks 工作區。您也可以使用 gclouddatabricks 指令列工具執行這些步驟,但相關指引不在本教學課程的範圍內。

Databricks on Google Cloud 是託管於 Google Cloud的 Databricks 環境,在 Google Kubernetes Engine (GKE) 上執行,並與 BigQuery 和其他 Google Cloud 技術提供內建整合功能。如果您是 Databricks 新手,請觀看「Databricks 整合式資料平台簡介」影片,瞭解 Databricks lakehouse 平台。

在 Google Cloud上部署 Databricks

請完成下列步驟,準備在 Google Cloud上部署 Databricks。

  1. 如要設定 Databricks 帳戶,請按照 Databricks 文件「設定 Databricks on Google Cloud帳戶」中的操作說明進行。
  2. 註冊後,請參閱這篇文章,進一步瞭解如何管理 Databricks 帳戶。

建立 Databricks 工作區、叢集和筆記本

下列步驟說明如何建立 Databricks 工作區、叢集和 Python 筆記本,以便編寫程式碼來存取 BigQuery。

  1. 確認 Databricks 必要條件

  2. 建立第一個工作區。在 Databricks 帳戶控制台中,按一下「Create Workspace」(建立工作區)

  3. 指定gcp-bq做為工作區名稱,然後選取區域

    「建立工作區」畫面,顯示工作區名稱、區域和 Google Cloud專案 ID

  4. 如要判斷 Google Cloud 專案 ID,請前往 Google Cloud 主控台,然後將值複製到「Google Cloud 專案 ID」欄位。

    前往 Google Cloud 控制台

  5. 按一下「儲存」,即可建立 Databricks 工作區。

  6. 如要使用 Databricks 執行階段 7.6 以上版本建立 Databricks 叢集,請在左側選單列選取「Clusters」(叢集),然後點選頂端的「Create Cluster」(建立叢集)

  7. 指定叢集名稱和大小,然後按一下「進階選項」,並指定服務帳戶的電子郵件地址。 Google Cloud

    新的叢集介面,顯示 Google 服務帳戶詳細資料

  8. 點選「建立叢集」

  9. 如要建立 Databricks 適用的 Python 筆記本,請按照「建立筆記本」一文中的操作說明進行。

從 Databricks 查詢 BigQuery

完成上述設定後,您就能安全地將 Databricks 連線至 BigQuery。Databricks 會使用開放原始碼 Google Spark Adapter 的分支版本存取 BigQuery。

Databricks 會自動將特定查詢述詞 (例如篩選巢狀資料欄) 下推至 BigQuery,藉此減少資料移轉量並加快查詢速度。此外,新增的這項功能可先透過 query() API 在 BigQuery 上執行 SQL 查詢,再進行資料移轉,因此可縮減產生的資料集移轉大小。

以下步驟說明如何在 BigQuery 中存取資料集,以及將自己的資料寫入 BigQuery。

存取 BigQuery 的公開資料集

BigQuery 提供可用公開資料集清單。如要查詢屬於公開資料集的 BigQuery 莎士比亞資料集,請按照下列步驟操作:

  1. 如要讀取 BigQuery 資料表,請在 Databricks 筆記本中使用下列程式碼片段。

    table = "bigquery-public-data.samples.shakespeare"
    df = spark.read.format("bigquery").option("table",table).load()
    df.createOrReplaceTempView("shakespeare")
    

    按下 Shift+Return 執行程式碼。

    現在,您可以透過 Spark DataFrame (df) 查詢 BigQuery 資料表。舉例來說,使用下列指令即可顯示 DataFrame 的前三列:

    df.show(3)
    

    如要查詢其他資料表,請更新 table 變數。

  2. Databricks 筆記本的主要功能是,您可以在單一筆記本中混合使用不同語言的儲存格,例如 Scala、Python 和 SQL。

    執行上一個建立暫時檢視區塊的儲存格後,您可以使用下列 SQL 查詢,以視覺化方式呈現莎士比亞作品的字數。

    %sql
    SELECT word, SUM(word_count) AS word_count FROM words GROUP BY word ORDER BY word_count DESC LIMIT 12
    
    

    莎士比亞作品的字數長條圖

    上方的儲存格會針對 Databricks 叢集中的資料架構執行 Spark SQL 查詢,而非 BigQuery。這種做法的好處是資料分析會在 Spark 層級進行,不會再發出 BigQuery API 呼叫,因此不會產生額外的 BigQuery 費用。

  3. 或者,您也可以使用 query() API 將 SQL 查詢的執行作業委派給 BigQuery,並進行最佳化,以減少產生的資料架構傳輸大小。與上述範例 (處理作業在 Spark 中完成) 不同,如果您使用這種方法,在 BigQuery 中執行查詢時,會套用定價和查詢最佳化。

    以下範例使用 Scala、query() API 和 BigQuery 中的莎士比亞公開資料集,計算莎士比亞作品中最常見的五個字詞。執行程式碼前,請先在 BigQuery 中建立名為 mdataset 的空白資料集,供程式碼參照。詳情請參閱「將資料寫入 BigQuery」。

    %scala
    // public dataset
    val table = "bigquery-public-data.samples.shakespeare"
    
    // existing dataset where the Google Cloud user has table creation permission
    val tempLocation = "mdataset"
    // query string
    val q = s"""SELECT word, SUM(word_count) AS word_count FROM ${table}
        GROUP BY word ORDER BY word_count DESC LIMIT 10 """
    
    // read the result of a GoogleSQL query into a DataFrame
    val df2 =
      spark.read.format("bigquery")
      .option("query", q)
      .option("materializationDataset", tempLocation)
      .load()
    
    // show the top 5 common words in Shakespeare
    df2.show(5)
    

    如需更多程式碼範例,請參閱 Databricks BigQuery 範例筆記本

將資料寫入 BigQuery

BigQuery 資料表位於資料集中。 如要將資料寫入 BigQuery 資料表,您必須先在 BigQuery 中建立新資料集。如要為 Databricks Python 筆記本建立資料集,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 展開「動作」選項,按一下「建立資料集」,然後命名為 together

  3. 在 Databricks Python 筆記本中,使用下列程式碼片段,從含有三個字串項目的 Python 清單建立簡單的 Spark 資料架構:

    from pyspark.sql.types import StringType
    mylist = ["Google", "Databricks", "better together"]
    
    df = spark.createDataFrame(mylist, StringType())
    
  4. 在筆記本中新增另一個儲存格,將上一個步驟中的 Spark 資料架構寫入資料集 together 的 BigQuery 資料表 myTable。系統會建立或覆寫資料表。使用您先前指定的值區名稱。

    bucket = YOUR_BUCKET_NAME
    table = "together.myTable"
    
    df.write
      .format("bigquery")
      .option("temporaryGcsBucket", bucket)
      .option("table", table)
      .mode("overwrite").save()
    
  5. 如要確認資料是否已成功寫入,請透過 Spark DataFrame (df) 查詢及顯示 BigQuery 資料表:

    display(spark.read.format("bigquery").option("table", table).load)