你可以用 Python 從筆記本建立並刷新獨立的實體化檢視表和串流資料表。 在 Python 筆記本中撰寫管線,並使用 spark.sql() 執行它們。 這讓你可以將獨立管線與其他以 Python 為基礎的筆記本工作流程一併管理。
Python Source 用於獨立管線需要一本筆記本連接到無伺服器的一般運算系統。 你不能用 Python 從 Databricks SQL 倉庫建立或刷新獨立管線,因為倉庫是執行 SQL 語句,不是 Python 筆記本。 若想改用 SQL 倉庫,請參見 「使用獨立實體化檢視 」及 「使用獨立串流資料表」。
要求
要用 Python 建立並刷新獨立管線,你需要一個筆記本連接到 Databricks 18.1 以上的無伺服器通用運算系統。 完整需求清單,包括區域可用性與權限,請參閱 筆記本。
運作原理
在 Python 筆記本中,將你從 Databricks SQL 倉庫執行的相同語句傳給 spark.sql()。 獨立的實體化檢視與串流資料表語法相同;只有提交聲明的方式不同。 與倉庫類似,每個 CREATE 或 REFRESH 語句都會運行無伺服器的管線來處理操作。
spark該會話預設可在 Azure Databricks 筆記本中使用,因此不需要匯入。
建立實體化視圖
下列範例會從基底資料表 mv1 中建立具體化檢視 base_table1:
spark.sql("""
CREATE OR REPLACE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM base_table1
GROUP BY date
""")
如需完整 CREATE MATERIALIZED VIEW 細節,例如排程與觸發刷新,請參閱 建立實體化視圖。
建立串流表
以下範例從 sales 資料表建立串流資料表 raw_data:
spark.sql("""
CREATE OR REFRESH STREAMING TABLE sales
AS SELECT product, price FROM STREAM raw_data
""")
完整 CREATE STREAMING TABLE 細節,包括用自動載入器載入檔案及排程,請參見 使用獨立串流表。
重新整理實體化的視圖或串流表
使用 REFRESH 陳述式,以來源端的最新資料更新獨立資料表:
spark.sql("REFRESH MATERIALIZED VIEW mv1")
spark.sql("REFRESH STREAMING TABLE sales")
在無伺服器一般運算中,刷新是同步的。 不支援非同步重新整理(ASYNC 關鍵字)。 參見 無伺服器一般計算。
參數化陳述
要將 Python 程式碼的值傳入語句,而非硬編碼,可以在 SQL 中使用命名參數標記,並透過 args 的spark.sql()參數提供其值。 直接使用如 :min_sales 這樣的標記來表示字面值。 僅在參數是物件名稱時,才以 IDENTIFIER() 包住標記,例如資料表、檢視表或綱要,因為識別碼不能以一般字串值替代。
以下範例同時參數化了實體化的視圖名稱與濾波器值:
mv_name = "main.sales.regional_sales"
min_sales = 1000
spark.sql("""
CREATE OR REPLACE MATERIALIZED VIEW IDENTIFIER(:mv)
AS SELECT
region,
sum(sales) AS sum_of_sales
FROM base_table1
WHERE sales > :min_sales
GROUP BY region
""", args={
"mv": mv_name,
"min_sales": min_sales,
})
欲了解更多資訊,請參閱 參數標記 與 IDENTIFIER 子句。
執行其他陳述式
你可以在 Python 筆記本中執行任何獨立的實體化檢視或串流資料表陳述式,只要將其傳遞給 spark.sql(),包括用於排定重新整理、修改資料表或卸除資料表的陳述式。 要了解如何使用實體化檢視與串流資料表,包括 SQL 語法,請參閱 使用獨立實體化檢視 與 使用獨立串流資料表。
Limitations
在無伺服器一般運算上建立的獨立實體化視圖與串流資料表還有額外限制,例如不支援非同步刷新,且無法按資料表歸因成本。 完整列表請參見 無伺服器一般計算。
由於這些管線運行於無伺服器的一般運算系統,而非 SQL 倉庫,因此不會繼承包覆式倉庫的自訂標籤。 倉庫標籤傳播 system.billing.usage 僅適用於從 SQL 倉庫執行的實體化檢視與串流資料表。 請參考 SQL 倉庫的屬性成本與自訂標籤。