Python 外掛程式

Python 外掛程式會使用 Python 指令碼執行使用者定義函數 (UDF)。 Python 指令碼會取得表格式資料作為其輸出,並產生表格式輸出。 外掛程式的執行階段是由沙箱中主控,在叢集節點上執行。

語法

T|evaluate [ (per_nodesingle | ) ] [=hint.remote=hint.distribution () ] output_schemalocal | auto腳本 [script_parameters] python(, [,,external_artifacts][,spill_to_disk])

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
output_schema string ✔️ type常值,定義 Python 程式代碼所傳回之表格式數據的輸出架構。 格式:typeof(ColumnName:ColumnType[, ...]),例如:typeof(col1:string, col2:long)。 若要延伸輸入結構描述,請使用下列語法:typeof(*, col1:string, col2:long)
指令碼 string ✔️ 要執行的有效 Python 腳本。 若要產生多行字串,請參閱 使用方式秘訣
script_parameters dynamic 要傳遞至 Python 腳本做為保留 kargs 字典之名稱值組的屬性包。 如需詳細資訊,請參閱保留的 Python 變數
hint.distribution string 外掛程式執行要分散到多個叢集節點的提示。 預設值是 singlesingle 表示文稿的單一實例會在整個查詢數據上執行。 per_node 表示如果 Python 區塊散發前的查詢,文稿的實例將會在每個節點上執行,而該腳本包含的數據則為 。
hint.remote string 此提示僅適用於跨叢集查詢。 預設值是 autoauto 表示伺服器會自動決定執行 Python 程式代碼的叢集。 將值設定為 local 強制在本機叢集上執行 Python 程式代碼。 在遠端叢集上停用 Python 外掛程式時,請使用它。
external_artifacts dynamic 可從雲端記憶體存取之成品的屬性包名稱和URL組。 如需詳細資訊 ,請參閱使用外部成品
spill_to_disk bool 指定將輸入數據表串行化為 Python 沙箱的替代方法。 若要序列化大型資料表,請將其設定為 true 以加速序列化,並大幅降低沙箱記憶體耗用量。 預設為 true

保留的 Python 變數

針對 Kusto 查詢語言和 Python 程式碼之間的互動,已保留下列變數。

  • df:輸入表格式資料 (T 上方的值),作為 pandas DataFrame。
  • kargsscript_parameters 引數的值,作為 Python 字典。
  • result:Python 指令碼所建立的 pandas 資料框架,其值會變成表格式資料,傳送至外掛程式之後的 Kusto 查詢運算子。

啟用外掛程式

外掛程式預設為停用。 開始之前,請先檢閱 必要條件清單。 若要啟用外掛程式並選取 Python 映像的版本,請參閱 在叢集上啟用語言延伸模組

Python 沙箱映像

若要變更 Python 映射的版本,請參閱 變更叢集上的 Python 語言延伸模組映像

若要查看不同 Python 映像的套件清單,請參閱 Python 套件參考

注意

  • 根據預設,外掛程式會將 numpy 匯入為 np ,並將 pandas 匯入為 pd。 您可以選擇性地視需要匯入其他模組。
  • 某些套件可能與外掛程式執行所在沙箱所強制執行的限制不相容。

使用查詢和更新原則的擷取

  • 在下列查詢中使用外掛程式:
    • 定義為更新原則的一部分,其來源資料表會內嵌為使用「非串流」內嵌。
    • 作為從查詢內嵌命令的一部分來執行,例如 .set-or-append
  • 您無法在定義為更新原則一部分的查詢中使用此外掛程式,其來源資料表是使用串流內嵌進行內嵌。

範例

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

顯示查詢結果的正弦示範螢幕快照。

print "This is an example for using 'external_artifacts'"
| evaluate python(
    typeof(File:string, Size:string), ```if 1:
    import os
    result = pd.DataFrame(columns=['File','Size'])
    sizes = []
    path = '.\\\\Temp'
    files = os.listdir(path)
    result['File']=files
    for file in files:
        sizes.append(os.path.getsize(path + '\\\\' + file))
    result['Size'] = sizes
    ```,
    external_artifacts = 
        dynamic({"this_is_my_first_file":"https://kustoscriptsamples.blob.core.windows.net/samples/R/sample_script.r",
                 "this_is_a_script":"https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py"})
)
檔案 大小
this_is_a_script 120
this_is_my_first_file 105

效能秘訣

  • 將外掛程式的輸入數據集縮減為 (資料行/資料列所需的最小數量) 。
    • 盡可能搭配 Kusto 的查詢語言,在來源數據集上使用篩選。
    • 若要在來源資料行的子集上進行計算,請先僅估計這些資料行,再叫用外掛程式。
  • 在指令碼中的邏輯可散佈時使用 hint.distribution = per_node
  • 請盡可能使用 Kusto 的查詢語言來實作 Python 指令碼的邏輯。

使用提示

  • 若要在查詢編輯器中產生包含 Python 腳本的多行字串,請從您慣用的 Python 編輯器中複製 Python 腳本, (JupyterVisual Studio CodePyCharm 等等) ,將它貼到查詢編輯器中,然後在包含三個連續反引號的行之間括住完整的腳本。 例如:

    ```
    python code
    ```

  • 使用 externaldata 運算子來取得您儲存在外部位置的指令碼內容,例如 Azure Blob 儲存體。

範例

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

使用外部成品

您可以從雲端記憶體取得外部成品供腳本使用,並在運行時間使用。

外部成品屬性所參考的 URL 必須是:

注意

使用受控識別驗證外部成品時, SandboxArtifacts 必須在叢集層級 受控識別原則上定義使用方式。

成品可供指令碼從本機臨時目錄 (.\Temp) 使用。 屬性包中提供的名稱是用來做為本機檔案名稱。 請參閱範例

如需參考外部套件的相關信息,請參閱 安裝 Python 外掛程式的套件

重新整理外部成品快取

查詢中使用的外部成品檔案會在叢集上快取。 如果您對雲端記憶體中的檔案進行更新,且需要立即與您的叢集同步處理,您可以使用 .clear 叢集快取外部成品命令。 此命令會清除快取的檔案,並確保後續的查詢會以最新版本的成品執行。

Python 外掛程式的安裝套件

您可能會因為下列原因而需要自行安裝套件:

  • 安裝套件是您自己的私人套件。
  • 安裝套件是公用套件,但不包含在外掛程式的基礎映像中。

按照下列步驟安裝套件:

必要條件

  1. 建立 Blob 容器來裝載套件,最好是在與叢集相同的位置。 例如:https://artifactswestus.blob.core.windows.net/python,假設您的叢集位於美國西部。

  2. 改變叢集的註標原則以允許存取該位置。

    • 此變更需要 AllDatabasesAdmin 權限。

    • 例如,若要允許存取位於 https://artifactswestus.blob.core.windows.net/python 中的 Blob,請執行下列命令:

    .alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactswestus\\.blob\\.core\\.windows\\.net/python/","CanCall": true } ]'
    

安裝套件

  1. 針對 PyPi 或其他通道中的公用套件,請下載套件及其相依項目。

    • 從本機 Windows Python 環境中的 Cmd 視窗中,執行:
    pip wheel [-w download-dir] package-name.
    
  2. 建立包含所需套件及其相依項目的 zip 檔案。

    • 若為私人套件,請壓縮套件的資料夾及其相依項目的資料夾。
    • 針對公用套件,請壓縮上一個步驟中所下載的檔案。

    注意

    • 請務必下載與 Python 引擎相容的套件,以及沙箱運行時間的平臺, (Windows) 目前為 3.6.5
    • 請務必壓縮 .whl 檔案本身,而不是其父系資料夾。
    • 您可以針對已存在於基礎沙箱映像中相同版本的套件,略過 .whl 檔案。
  3. 將 Blob 壓縮檔案上傳至成品位置 (來自步驟 1)。

  4. 呼叫 python 外掛程式。

    • 指定 external_artifacts 參數,包含名稱的屬性包以及 zip 檔案參考 (BLOB 的 URL,包括 SAS 權杖)。
    • 在內嵌 Python 程式碼中,從 sandbox_utils 匯入 Zipackage,並使用 zip 檔案的名稱呼叫其 install() 方法。

範例

安裝產生假資料的 Faker 套件。

range ID from 1 to 3 step 1 
| extend Name=''
| evaluate python(typeof(*), ```if 1:
    from sandbox_utils import Zipackage
    Zipackage.install("Faker.zip")
    from faker import Faker
    fake = Faker()
    result = df
    for i in range(df.shape[0]):
        result.loc[i, "Name"] = fake.name()
    ```,
    external_artifacts=bag_pack('faker.zip', 'https://artifacts.blob.core.windows.net/kusto/Faker.zip?*** REPLACE WITH YOUR SAS TOKEN ***'))
ID 名稱
1 Gary Tapia
2 Emma Evans
3 Ashley Bowen

如需使用 Python 外掛程式的 UDF 函式更多範例,請參閱 Functions 連結

Python 外掛程式會使用 Python 指令碼執行使用者定義函數 (UDF)。 Python 指令碼會取得表格式資料作為其輸出,並產生表格式輸出。

Syntax

T|evaluate [ (singleper_node | ) ] [=hint.distribution=hint.remote () ]python( output_schemalocal | ,auto腳本 [script_parameters] [,,spill_to_disk])

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
output_schema string ✔️ type常值,定義 Python 程式代碼所傳回之表格式數據的輸出架構。 格式:typeof(ColumnName:ColumnType[, ...]),例如:typeof(col1:string, col2:long)。 若要延伸輸入結構描述,請使用下列語法:typeof(*, col1:string, col2:long)
指令碼 string ✔️ 要執行的有效 Python 腳本。 若要產生多行字串,請參閱 使用方式秘訣
script_parameters dynamic 要傳遞至 Python 腳本做為保留 kargs 字典之名稱值組的屬性包。 如需詳細資訊,請參閱保留的 Python 變數
hint.distribution string 外掛程式執行要分散到多個叢集節點的提示。 預設值是 singlesingle 表示文稿的單一實例會在整個查詢數據上執行。 per_node 表示如果 Python 區塊散發前的查詢,文稿的實例將會在每個節點上執行,而該腳本包含的數據則為 。
hint.remote string 此提示僅適用於跨叢集查詢。 預設值是 autoauto 表示伺服器會自動決定執行 Python 程式代碼的叢集。 將值設定為 local 強制在本機叢集上執行 Python 程式代碼。 在遠端叢集上停用 Python 外掛程式時,請使用它。
spill_to_disk bool 指定將輸入數據表串行化為 Python 沙箱的替代方法。 若要序列化大型資料表,請將其設定為 true 以加速序列化,並大幅降低沙箱記憶體耗用量。 預設為 true

保留的 Python 變數

針對 Kusto 查詢語言和 Python 程式碼之間的互動,已保留下列變數。

  • df:輸入表格式資料 (T 上方的值),作為 pandas DataFrame。
  • kargsscript_parameters 引數的值,作為 Python 字典。
  • result:Python 指令碼所建立的 pandas 資料框架,其值會變成表格式資料,傳送至外掛程式之後的 Kusto 查詢運算子。

啟用外掛程式

外掛程式預設為停用。 開始之前,請在 KQL 資料庫中 啟用 Python 外掛程式

Python 沙箱映像

若要查看不同 Python 映像的套件清單,請參閱 Python 套件參考

注意

  • 根據預設,外掛程式會將 numpy 匯入為 np ,並將 pandas 匯入為 pd。 您可以選擇性地視需要匯入其他模組。
  • 某些套件可能與外掛程式執行所在沙箱所強制執行的限制不相容。

使用查詢和更新原則的擷取

  • 在下列查詢中使用外掛程式:
    • 定義為更新原則的一部分,其來源資料表會內嵌為使用「非串流」內嵌。
    • 作為從查詢內嵌命令的一部分來執行,例如 .set-or-append
  • 您無法在定義為更新原則一部分的查詢中使用此外掛程式,其來源資料表是使用串流內嵌進行內嵌。

範例

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

顯示查詢結果的正弦示範螢幕快照。

效能秘訣

  • 將外掛程式的輸入數據集縮減為 (資料行/資料列所需的最小數量) 。
    • 盡可能搭配 Kusto 的查詢語言,在來源數據集上使用篩選。
    • 若要在來源資料行的子集上進行計算,請先僅估計這些資料行,再叫用外掛程式。
  • 在指令碼中的邏輯可散佈時使用 hint.distribution = per_node
  • 請盡可能使用 Kusto 的查詢語言來實作 Python 指令碼的邏輯。

使用提示

  • 若要在查詢編輯器中產生包含 Python 腳本的多行字串,請從您最愛的 Python 編輯器中複製 Python 腳本, (JupyterVisual Studio CodePyCharm 等等) ,將它貼到查詢編輯器中,然後在包含三個連續反引號的行之間括住完整的腳本。 例如:

    ```
    python code
    ```

  • 使用 externaldata 運算子來取得您儲存在外部位置的指令碼內容,例如 Azure Blob 儲存體。

範例

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

如需使用 Python 外掛程式的 UDF 函式更多範例,請參閱 Functions 連結

不支援此功能。