Python 外掛程式
Python 外掛程式會使用 Python 指令碼執行使用者定義函數 (UDF)。 Python 指令碼會取得表格式資料作為其輸出,並產生表格式輸出。 外掛程式的執行階段是由沙箱中主控,在叢集節點上執行。
語法
T|
evaluate
[ (per_node
single
| ) ] [=
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 |
外掛程式執行要分散到多個叢集節點的提示。 預設值是 single 。 single 表示文稿的單一實例會在整個查詢數據上執行。 per_node 表示如果 Python 區塊散發前的查詢,文稿的實例將會在每個節點上執行,而該腳本包含的數據則為 。 |
|
hint.remote | string |
此提示僅適用於跨叢集查詢。 預設值是 auto 。 auto 表示伺服器會自動決定執行 Python 程式代碼的叢集。 將值設定為 local 強制在本機叢集上執行 Python 程式代碼。 在遠端叢集上停用 Python 外掛程式時,請使用它。 |
|
external_artifacts | dynamic |
可從雲端記憶體存取之成品的屬性包名稱和URL組。 如需詳細資訊 ,請參閱使用外部成品。 | |
spill_to_disk | bool |
指定將輸入數據表串行化為 Python 沙箱的替代方法。 若要序列化大型資料表,請將其設定為 true 以加速序列化,並大幅降低沙箱記憶體耗用量。 預設為 true 。 |
保留的 Python 變數
針對 Kusto 查詢語言和 Python 程式碼之間的互動,已保留下列變數。
df
:輸入表格式資料 (T
上方的值),作為pandas
DataFrame。kargs
:script_parameters 引數的值,作為 Python 字典。result
:Python 指令碼所建立的pandas
資料框架,其值會變成表格式資料,傳送至外掛程式之後的 Kusto 查詢運算子。
啟用外掛程式
外掛程式預設為停用。 開始之前,請先檢閱 必要條件清單。 若要啟用外掛程式並選取 Python 映像的版本,請參閱 在叢集上啟用語言延伸模組。
Python 沙箱映像
若要變更 Python 映射的版本,請參閱 變更叢集上的 Python 語言延伸模組映像。
若要查看不同 Python 映像的套件清單,請參閱 Python 套件參考。
注意
- 根據預設,外掛程式會將 numpy 匯入為 np ,並將 pandas 匯入為 pd。 您可以選擇性地視需要匯入其他模組。
- 某些套件可能與外掛程式執行所在沙箱所強制執行的限制不相容。
使用查詢和更新原則的擷取
- 在下列查詢中使用外掛程式:
- 您無法在定義為更新原則一部分的查詢中使用此外掛程式,其來源資料表是使用串流內嵌進行內嵌。
範例
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 腳本, (Jupyter、Visual Studio Code、PyCharm 等等) ,將它貼到查詢編輯器中,然後在包含三個連續反引號的行之間括住完整的腳本。 例如:
```
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 外掛程式的安裝套件
您可能會因為下列原因而需要自行安裝套件:
- 安裝套件是您自己的私人套件。
- 安裝套件是公用套件,但不包含在外掛程式的基礎映像中。
按照下列步驟安裝套件:
必要條件
建立 Blob 容器來裝載套件,最好是在與叢集相同的位置。 例如:
https://artifactswestus.blob.core.windows.net/python
,假設您的叢集位於美國西部。改變叢集的註標原則以允許存取該位置。
此變更需要 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 } ]'
安裝套件
針對 PyPi 或其他通道中的公用套件,請下載套件及其相依項目。
- 從本機 Windows Python 環境中的 Cmd 視窗中,執行:
pip wheel [-w download-dir] package-name.
建立包含所需套件及其相依項目的 zip 檔案。
- 若為私人套件,請壓縮套件的資料夾及其相依項目的資料夾。
- 針對公用套件,請壓縮上一個步驟中所下載的檔案。
注意
- 請務必下載與 Python 引擎相容的套件,以及沙箱運行時間的平臺, (Windows) 目前為 3.6.5
- 請務必壓縮
.whl
檔案本身,而不是其父系資料夾。 - 您可以針對已存在於基礎沙箱映像中相同版本的套件,略過
.whl
檔案。
將 Blob 壓縮檔案上傳至成品位置 (來自步驟 1)。
呼叫
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
[ (single
per_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 |
外掛程式執行要分散到多個叢集節點的提示。 預設值是 single 。 single 表示文稿的單一實例會在整個查詢數據上執行。 per_node 表示如果 Python 區塊散發前的查詢,文稿的實例將會在每個節點上執行,而該腳本包含的數據則為 。 |
|
hint.remote | string |
此提示僅適用於跨叢集查詢。 預設值是 auto 。 auto 表示伺服器會自動決定執行 Python 程式代碼的叢集。 將值設定為 local 強制在本機叢集上執行 Python 程式代碼。 在遠端叢集上停用 Python 外掛程式時,請使用它。 |
|
spill_to_disk | bool |
指定將輸入數據表串行化為 Python 沙箱的替代方法。 若要序列化大型資料表,請將其設定為 true 以加速序列化,並大幅降低沙箱記憶體耗用量。 預設為 true 。 |
保留的 Python 變數
針對 Kusto 查詢語言和 Python 程式碼之間的互動,已保留下列變數。
df
:輸入表格式資料 (T
上方的值),作為pandas
DataFrame。kargs
:script_parameters 引數的值,作為 Python 字典。result
:Python 指令碼所建立的pandas
資料框架,其值會變成表格式資料,傳送至外掛程式之後的 Kusto 查詢運算子。
啟用外掛程式
外掛程式預設為停用。 開始之前,請在 KQL 資料庫中 啟用 Python 外掛程式 。
Python 沙箱映像
若要查看不同 Python 映像的套件清單,請參閱 Python 套件參考。
注意
- 根據預設,外掛程式會將 numpy 匯入為 np ,並將 pandas 匯入為 pd。 您可以選擇性地視需要匯入其他模組。
- 某些套件可能與外掛程式執行所在沙箱所強制執行的限制不相容。
使用查詢和更新原則的擷取
- 在下列查詢中使用外掛程式:
- 您無法在定義為更新原則一部分的查詢中使用此外掛程式,其來源資料表是使用串流內嵌進行內嵌。
範例
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 腳本, (Jupyter、Visual Studio Code、PyCharm 等等) ,將它貼到查詢編輯器中,然後在包含三個連續反引號的行之間括住完整的腳本。 例如:
```
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 連結 庫。
不支援此功能。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應