分享方式:


Azure Functions 的 Azure 數據總管輸出系結 (預覽)

當函式執行時,Azure 數據總管輸出系結會將數據內嵌至 Azure 數據總管。

如需安裝和組態詳細數據的詳細資訊,請參閱概

範例

您可以使用下列其中一種 C# 模式來建立 C# 函式:

  • 隔離的背景工作模型:在與運行時間隔離的背景工作進程中執行的已編譯 C# 函式。 需要隔離的背景工作進程,才能支援在 LTS 和非 LTS 版本 .NET 和 .NET Framework 上執行的 C# 函式。
  • 同進程模型:在與 Functions 運行時間相同的進程中執行的已編譯 C# 函式。
  • C# 文稿:主要用於在 Azure 入口網站 中建立 C# 函式。

GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。

本區段包含下列範例:

這些範例會參考 Product 類別和對應的資料庫資料表:

public class Product
{
    [JsonProperty(nameof(ProductID))]
    public long ProductID { get; set; }

    [JsonProperty(nameof(Name))]
    public string Name { get; set; }

    [JsonProperty(nameof(Cost))]
    public double Cost { get; set; }
}
.create-merge table Products (ProductID:long, Name:string, Cost:double)

HTTP 觸發程式,寫入一筆記錄

下列範例顯示 將記錄新增至資料庫的 C# 函式 。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProduct
    {
        [Function("AddProduct")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products")]
        public static async Task<Product> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductuni")]
            HttpRequestData req)
        {
            Product? prod = await req.ReadFromJsonAsync<Product>();
            return prod ?? new Product { };
        }
    }
}

HTTP 觸發程式,使用對應寫入記錄

下列範例示範 將記錄集合加入至資料庫的 C# 函式 。 函式會使用將轉換成 的ProductItem對應。

若要將資料從 Product Item轉換成 ,函式會使用對應參考:

.create-merge table Item (ItemID:long, ItemName:string, ItemCost:float)


-- Create a mapping that transforms an Item to a Product

.create-or-alter table Product ingestion json mapping "item_to_product_json" '[{"column":"ProductID","path":"$.ItemID"},{"column":"Name","path":"$.ItemName"},{"column":"Cost","path":"$.ItemCost"}]'
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common
{
    public class Item
    {
        public long ItemID { get; set; }

        public string? ItemName { get; set; }

        public double ItemCost { get; set; }
    }
}
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProductsWithMapping
    {
        [Function("AddProductsWithMapping")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products", MappingRef = "item_to_product_json")]
        public static async Task<Item> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductswithmapping")]
            HttpRequestData req)
        {
            Item? item = await req.ReadFromJsonAsync<Item>();
            return item ?? new Item { };
        }
    }
}

GitHub 存放庫中提供 Java Azure 數據總管輸入系結的更多範例。

本區段包含下列範例:

這些範例會參考類別 Products (在不同的檔案 Product.java中)和對應的資料庫數據表 Products (稍早定義):

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("Name")
    public String Name;
    @JsonProperty("Cost")
    public double Cost;

    public Product() {
    }

    public Product(long ProductID, String name, double Cost) {
        this.ProductID = ProductID;
        this.Name = name;
        this.Cost = Cost;
    }
}

HTTP 觸發程式,將記錄寫入數據表

下列範例顯示 Java 函式中的 Azure 數據總管輸出系結,可將產品記錄新增至數據表。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。 函式會採用 com.fasterxml.jackson.core 連結庫的另一個相依性來剖析 JSON 主體。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;

import java.io.IOException;
import java.util.Optional;

import static com.microsoft.azure.kusto.common.Constants.*;

public class AddProduct {
    @FunctionName("AddProduct")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addproductuni") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

HTTP 觸發程序,寫入至兩個資料表

下列範例顯示 Java 函式中的 Azure 數據總管輸出系結,可將記錄新增至兩個不同數據表中的資料庫 (ProductProductChangeLog)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。 函式會採用 com.fasterxml.jackson.core 連結庫的另一個相依性來剖析 JSON 主體。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>

第二個資料表 ProductsChangeLog,對應至下列定義:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

ProductsChangeLog.java與 Java 類別:

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class ProductsChangeLog {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("CreatedAt")
    public String CreatedAt;

    public ProductsChangeLog() {
    }

    public ProductsChangeLog(long ProductID, String CreatedAt) {
        this.ProductID = ProductID;
        this.CreatedAt = CreatedAt;
    }
}
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;
import com.microsoft.azure.kusto.common.ProductsChangeLog;

import static com.microsoft.azure.kusto.common.Constants.*;

import java.io.IOException;
import java.time.Clock;
import java.time.Instant;
import java.util.Optional;

public class AddMultiTable {
    @FunctionName("AddMultiTable")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addmultitable") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product,
            @KustoOutput(name = "productChangeLog", database = "productsdb", tableName = "ProductsChangeLog",
                    connection = KUSTOCONNSTR) OutputBinding<ProductsChangeLog> productChangeLog)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            productChangeLog.setValue(new ProductsChangeLog(p.ProductID, Instant.now(Clock.systemUTC()).toString()));
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。

本區段包含下列範例:

這些範例會參考資料庫數據表。

這些範例會參考數據表 ProductsProductsChangeLog (稍早定義)。

HTTP 觸發程序,將記錄寫入至資料表

下列範例示範function.json檔案中的 Azure 數據總管輸出系結,以及將記錄新增至數據表的 JavaScript 函式。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。

下列範例是系結function.json檔案中的數據

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addproduct"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

區段說明這些屬性。

下列代碼段是範例 JavaScript 程式代碼:

// Insert the product, which will insert it into the Products table.
module.exports = async function (context, req) {
    // Note that this expects the body to be a JSON object or array of objects which have a property
    // matching each of the columns in the table to insert to.
    context.bindings.product = req.body;
    return {
        status: 201,
        body: req.body
    };
}

HTTP 觸發程序,寫入至兩個資料表

下列範例顯示function.json檔案中的 Azure 數據總管輸出系結,以及 JavaScript 函式,可將記錄新增至兩個不同數據表中的資料庫 (ProductsProductsChangeLog)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。

第二個資料表 ProductsChangeLog,對應至下列定義:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

下列代碼段是系結function.json檔案中的數據

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

區段說明這些屬性。

下列代碼段是範例 JavaScript 程式代碼:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger and Kusto output binding function processed a request.');
    context.log(req.body);

    if (req.body) {
        var changeLog = {ProductID:req.body.ProductID, CreatedAt: new Date().toISOString()};
        context.bindings.product = req.body;
        context.bindings.productchangelog = changeLog;
        context.res = {
            body: req.body,
            mimetype: "application/json",
            status: 201
        }
    } else {
        context.res = {
            status: 400,
            body: "Error reading request body"
        }
    }
}

GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。

本區段包含下列範例:

這些範例會參考數據表 ProductsProductsChangeLog (稍早定義)。

HTTP 觸發程序,將記錄寫入至資料表

下列範例示範function.json檔案中的 Azure 數據總管輸出系結,以及將記錄新增至數據表的 Python 函式。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。

下列代碼段是系結function.json檔案中的數據

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addproductuni"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ]
}

區段說明這些屬性。

下列代碼段是 Python 程式代碼範例:

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    product.set(body)
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

HTTP 觸發程序,寫入至兩個資料表

下列範例顯示function.json檔案中的 Azure 數據總管輸出系結,以及 JavaScript 函式,可將記錄新增至兩個不同數據表中的資料庫 (ProductsProductsChangeLog)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。 第二個資料表 ProductsChangeLog,對應至下列定義:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

下列代碼段是系結function.json檔案中的數據

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ]
}

區段說明這些屬性。

下列代碼段是 Python 程式代碼範例:

import json
from datetime import datetime

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str],productchangelog: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    # parse x:
    product.set(body)
    id = json.loads(body)["ProductID"]

    changelog = {
        "ProductID": id,
        "CreatedAt": datetime.now().isoformat(),
    }
    productchangelog.set(json.dumps(changelog))
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

屬性

C# 連結 會使用 KustoAttribute 屬性來宣告函式上的 Azure 數據總管系結,其具有下列屬性。

屬性內容 描述
資料庫 必要。 必須對其執行查詢的資料庫。
連線 必要。 保留 連接字串的變數名稱,該變數會透過環境變數或函式應用程式設定解析。 預設會查閱變數 KustoConnectionString。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId
TableName 必要。 要內嵌數據的數據表。
MappingRef 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。
ManagedServiceIdentity 選擇性。 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。
DataFormat 選擇性。 預設資料格式為 multijson/json。 它可以設定為格式列舉datasource支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。

註釋

Java 函式運行時間連結庫會使用@KustoInput註釋 (com.microsoft.azure.functions.kusto.annotation.KustoOutput)。

元素 描述
NAME 必要。 代表函式程式代碼中查詢結果的變數名稱。
database 必要。 必須對其執行查詢的資料庫。
connection 必要。 保存 連接字串的變數名稱,該變數會透過環境變數或函式應用程式設定解析。 預設會查閱變數 KustoConnectionString。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId
tableName 必要。 要內嵌數據的數據表。
mappingRef 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。
dataFormat 選擇性。 預設資料格式為 multijson/json。 它可以設定為格式列舉datasource支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。
managedServiceIdentity 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。

組態

下表說明您在 function.json 檔案中設定的繫結設定屬性。

function.json 屬性 描述
type 必要。 必須設定為 kusto
direction 必要。 必須設定為 out
NAME 必要。 代表函式程式代碼中查詢結果的變數名稱。
database 必要。 必須對其執行查詢的資料庫。
connection 必要。 保存 連接字串、透過環境變數或函式應用程式設定解析的變數名稱。 預設會查閱變數 KustoConnectionString。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId
tableName 必要。 要內嵌數據的數據表。
mappingRef 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。
dataFormat 選擇性。 預設資料格式為 multijson/json。 它可以設定為格式列舉datasource支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。
managedServiceIdentity 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

使用方式

屬性的建構函式會採用資料庫和屬性 TableNameMappingRef和以及 DataFormat 連接設定名稱。 KQL 命令可以是 KQL 語句或 KQL 函式。 連接字串 設定名稱會對應至包含 Kusto 連接字串 的應用程式設定(用於local.settings.json本機開發)。 例如:"KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId。 輸入系結所執行的查詢會參數化。 KQL 參數中提供的值會在運行時間使用。

下一步

從資料表讀取資料(輸入系結)