Gäller för: ✅Microsoft Fabric✅Azure Data Explorer
I den här artikeln lär du dig att:
Förutsättningar
Konfigurera utvecklingsmiljön att använda Kusto-klientbiblioteket.
Kör ett hanteringskommando och bearbeta resultatet
I önskad IDE eller textredigerare skapar du ett projekt eller en fil med namnet hanteringskommandon med den konvention som är lämplig för det språk du föredrar. Lägg sedan till följande kod:
Skapa en klientapp som ansluter klustret. Ersätt platshållaren <your_cluster_uri> med ditt klusternamn.
Not
För hanteringskommandon kommer du att använda klientfabrikmetoden CreateCslAdminProvider.
using Kusto.Data;
using Kusto.Data.Net.Client;
namespace ManagementCommands {
class ManagementCommands {
static void Main(string[] args) {
var clusterUri = "<your_cluster_uri>";
var kcsb = new KustoConnectionStringBuilder(clusterUri)
.WithAadUserPromptAuthentication();
using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kcsb)) {
}
}
}
}
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder
def main():
cluster_uri = "<your_cluster_uri>"
kcsb = KustoConnectionStringBuilder.with_interactive_login(cluster_uri)
with KustoClient(kcsb) as kusto_client:
if __name__ == "__main__":
main()
import { Client as KustoClient, KustoConnectionStringBuilder } from "azure-kusto-data/";
import { InteractiveBrowserCredentialInBrowserOptions } from "@azure/identity";
async function main() {
const clusterUri = "<your_cluster_uri>";
const authOptions = {
clientId: "00001111-aaaa-2222-bbbb-3333cccc4444",
redirectUri: "http://localhost:5173",
} as InteractiveBrowserCredentialInBrowserOptions;
const kcsb = KustoConnectionStringBuilder.withUserPrompt(clusterUri, authOptions);
const kustoClient = new KustoClient(kcsb);
}
main();
Notera
För Node.js appar använder du InteractiveBrowserCredentialNodeOptions i stället för InteractiveBrowserCredentialInBrowserOptions.
import com.microsoft.azure.kusto.data.Client;
import com.microsoft.azure.kusto.data.ClientFactory;
import com.microsoft.azure.kusto.data.KustoOperationResult;
import com.microsoft.azure.kusto.data.KustoResultSetTable;
import com.microsoft.azure.kusto.data.KustoResultColumn;
import com.microsoft.azure.kusto.data.auth.ConnectionStringBuilder;
public class ManagementCommands {
public static void main(String[] args) throws Exception {
try {
String clusterUri = "<your_cluster_uri>";
ConnectionStringBuilder kcsb = ConnectionStringBuilder.createWithUserPrompt(clusterUri);
try (Client kustoClient = ClientFactory.createClient(kcsb)) {
}
}
}
}
Definiera en funktion som skriver ut kommandot som körs och dess resulterande tabeller. Den här funktionen packar upp kolumnnamnen i resultattabellerna och skriver ut varje namn/värde-par på en ny rad.
static void PrintResultsAsValueList(string command, IDataReader response) {
while (response.Read()) {
Console.WriteLine("\n{0}\n", new String('-', 20));
Console.WriteLine("Command: {0}", command);
Console.WriteLine("Result:");
for (int i = 0; i < response.FieldCount; i++) {
Console.WriteLine("\t{0} - {1}", response.GetName(i), response.IsDBNull(i) ? "None" : response.GetString(i));
}
}
}
def print_result_as_value_list(command, response):
# create a list of columns
cols = (col.column_name for col in response.primary_results[0].columns)
print("\n" + "-" * 20 + "\n")
print("Command: " + command)
# print the values for each row
for row in response.primary_results[0]:
print("Result:")
for col in cols:
print("\t", col, "-", row[col])
function printResultsAsValueList(command: string, response: KustoResponseDataSet) {
// create a list of columns
const cols = response.primaryResults[0].columns;
console.log("\n" + "-".repeat(20) + "\n")
console.log("Command: " + command)
// print the values for each row
for (const row of response.primaryResults[0].rows()) {
console.log("Result:")
for (col of cols)
console.log("\t", col.name, "-", row.getValueAt(col.ordinal) ? row.getValueAt(col.ordinal).toString() : "None")
}
}
public static void printResultsAsValueList(String command, KustoResultSetTable results) {
while (results.next()) {
System.out.println("\n" + "-".repeat(20) + "\n");
System.out.println("Command: " + command);
System.out.println("Result:");
KustoResultColumn[] columns = results.getColumns();
for (int i = 0; i < columns.length; i++) {
System.out.println("\t" + columns[i].getColumnName() + " - " + (results.getObject(i) == null ? "None" : results.getString(i)));
}
}
}
Definiera kommandot som ska köras. Kommandot skapar en tabell med namnet MyStormEvents och definierar tabellschemat som en lista med kolumnnamn och typer. Ersätt platshållaren <your_database> med databasnamnet.
string database = "<your_database>";
string table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
string command = @$".create table {table}
(StartTime:datetime,
EndTime:datetime,
State:string,
DamageProperty:int,
DamageCrops:int,
Source:string,
StormSummary:dynamic)";
database = "<your_database>"
table = "MyStormEvents"
# Create a table named MyStormEvents
# The brackets contain a list of column Name:Type pairs that defines the table schema
command = ".create table " + table + " " \
"(StartTime:datetime," \
" EndTime:datetime," \
" State:string," \
" DamageProperty:int," \
" DamageCrops:int," \
" Source:string," \
" StormSummary:dynamic)"
const database = "<your_database>";
const table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
const command = `.create table ${table}
(StartTime:datetime,
EndTime:datetime,
State:string,
DamageProperty:int,
Source:string,
StormSummary:dynamic)`;
String database = "<your_database>";
String table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
String command = ".create table " + table + " " +
"(StartTime:datetime," +
" EndTime:datetime," +
" State:string," +
" DamageProperty:int," +
" DamageCrops:int," +
" Source:string," +
" StormSummary:dynamic)";
Kör kommandot och skriv ut resultatet med hjälp av den tidigare definierade funktionen.
Not
Du använder metoden ExecuteControlCommand för att köra kommandot.
using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
PrintResultsAsValueList(command, response);
}
Not
Du använder metoden execute_mgmt för att köra kommandot.
response = kusto_client.execute_mgmt(database, command)
print_result_as_value_list(command, response)
Not
Du använder metoden executeMgmt för att köra kommandot.
const response = await kustoClient.executeMgmt(database, command);
printResultsAsValueList(command, response)
KustoOperationResult response = kusto_client.execute(database, command);
printResultsAsValueList(command, response.getPrimaryResults());
Den fullständiga koden bör se ut så här:
using Kusto.Data;
using Kusto.Data.Net.Client;
namespace ManagementCommands {
class ManagementCommands {
static void Main(string[] args) {
string clusterUri = "https://<your_cluster_uri>";
var kcsb = new KustoConnectionStringBuilder(clusterUri)
.WithAadUserPromptAuthentication();
using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kcsb)) {
string database = "<your_database>";
string table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
string command = @$".create table {table}
(StartTime:datetime,
EndTime:datetime,
State:string,
DamageProperty:int,
DamageCrops:int,
Source:string,
StormSummary:dynamic)";
using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
PrintResultsAsValueList(command, response);
}
}
}
static void PrintResultsAsValueList(string command, IDataReader response) {
while (response.Read()) {
Console.WriteLine("\n{0}\n", new String('-', 20));
Console.WriteLine("Command: {0}", command);
Console.WriteLine("Result:");
for (int i = 0; i < response.FieldCount; i++) {
Console.WriteLine("\t{0} - {1}", response.GetName(i), response.IsDBNull(i) ? "None" : response.GetString(i));
}
}
}
}
}
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder
def main():
cluster_uri = "https://<your_cluster_uri>"
kcsb = KustoConnectionStringBuilder.with_interactive_login(cluster_uri)
with KustoClient(kcsb) as kusto_client:
database = "<your_database>"
table = "MyStormEvents"
# Create a table named MyStormEvents
# The brackets contain a list of column Name:Type pairs that defines the table schema
command = ".create table " + table + " " \
"(StartTime:datetime," \
" EndTime:datetime," \
" State:string," \
" DamageProperty:int," \
" DamageCrops:int," \
" Source:string," \
" StormSummary:dynamic)"
response = kusto_client.execute_mgmt(database, command)
print_result_as_value_list(command, response)
def print_result_as_value_list(command, response):
# create a list of columns
cols = (col.column_name for col in response.primary_results[0].columns)
print("\n" + "-" * 20 + "\n")
print("Command: " + command)
# print the values for each row
for row in response.primary_results[0]:
print("Result:")
for col in cols:
print("\t", col, "-", row[col])
if __name__ == "__main__":
main()
import { Client as KustoClient, KustoConnectionStringBuilder, KustoResponseDataSet } from "azure-kusto-data/";
import { InteractiveBrowserCredentialInBrowserOptions } from "@azure/identity";
async function main() {
const clusterUri = "<your_cluster_uri>";
const authOptions = {
clientId: "00001111-aaaa-2222-bbbb-3333cccc4444",
redirectUri: "http://localhost:5173",
} as InteractiveBrowserCredentialInBrowserOptions;
const kcsb = KustoConnectionStringBuilder.withUserPrompt(clusterUri, authOptions);
const kustoClient = new KustoClient(kcsb);
const database = "<your_database>";
const table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
const command = `.create table ${table}
(StartTime:datetime,
EndTime:datetime,
State:string,
DamageProperty:int,
Source:string,
StormSummary:dynamic)`;
const response = await kustoClient.executeMgmt(database, command);
printResultsAsValueList(command, response)
}
function printResultsAsValueList(command: string, response: KustoResponseDataSet) {
// create a list of columns
const cols = response.primaryResults[0].columns;
console.log("\n" + "-".repeat(20) + "\n")
console.log("Command: " + command)
// print the values for each row
for (const row of response.primaryResults[0].rows()) {
console.log("Result:")
for (const col of cols) {
console.log("\t", col.name, "-", row.getValueAt(col.ordinal) ? row.getValueAt(col.ordinal).toString() : "None")
}
}
}
main();
Notera
För Node.js appar använder du InteractiveBrowserCredentialNodeOptions i stället för InteractiveBrowserCredentialInBrowserOptions.
import com.microsoft.azure.kusto.data.Client;
import com.microsoft.azure.kusto.data.ClientFactory;
import com.microsoft.azure.kusto.data.KustoOperationResult;
import com.microsoft.azure.kusto.data.KustoResultSetTable;
import com.microsoft.azure.kusto.data.KustoResultColumn;
import com.microsoft.azure.kusto.data.auth.ConnectionStringBuilder;
public class ManagementCommands {
public static void main(String[] args) throws Exception {
try {
String clusterUri = "https://<your_cluster_uri>";
ConnectionStringBuilder kcsb = ConnectionStringBuilder.createWithUserPrompt(clusterUri);
try (Client kustoClient = ClientFactory.createClient(kcsb)) {
String database = "<your_database>";
String table = "MyStormEvents";
// Create a table named MyStormEvents
// The brackets contain a list of column Name:Type pairs that defines the table schema
String command = ".create table " + table + " " +
"(StartTime:datetime," +
" EndTime:datetime," +
" State:string," +
" DamageProperty:int," +
" DamageCrops:int," +
" Source:string," +
" StormSummary:dynamic)";
KustoOperationResult response = kustoClient.execute(database, command);
printResultsAsValueList(command, response.getPrimaryResults());
}
}
}
public static void printResultsAsValueList(String command, KustoResultSetTable results) {
while (results.next()) {
System.out.println("\n" + "-".repeat(20) + "\n");
System.out.println("Command: " + command);
System.out.println("Result:");
KustoResultColumn[] columns = results.getColumns();
for (int i = 0; i < columns.length; i++) {
System.out.println("\t" + columns[i].getColumnName() + " - " + (results.getObject(i) == null ? "None" : results.getString(i)));
}
}
}
}
Kör din app
I ett kommandogränssnitt använder du följande kommando för att köra appen:
# Change directory to the folder that contains the management commands project
dotnet run .
python management_commands.py
I en miljö av typen Node.js
node management-commands.js
I en webbläsarmiljö använder du lämpligt kommando för att köra appen. Till exempel för Vite-React:
npm run dev
mvn install exec:java -Dexec.mainClass="<groupId>.ManagementCommands"
Du bör se ett resultat som liknar följande:
--------------------
Command: .create table MyStormEvents
(StartTime:datetime,
EndTime:datetime,
State:string,
DamageProperty:int,
Source:string,
StormSummary:dynamic)
Result:
TableName - MyStormEvents
Schema - {"Name":"MyStormEvents","OrderedColumns":[{"Name":"StartTime","Type":"System.DateTime","CslType":"datetime"},{"Name":"EndTime","Type":"System.DateTime","CslType":"datetime"},{"Name":"State","Type":"System.String","CslType":"string"},{"Name":"DamageProperty","Type":"System.Int32","CslType":"int"},{"Name":"Source","Type":"System.String","CslType":"string"},{"Name":"StormSummary","Type":"System.Object","CslType":"dynamic"}]}
DatabaseName - MyDatabaseName
Folder - None
DocString - None
Ändra principen för batchbearbetning på tabellnivå
Du kan anpassa beteendet för inmatningsbatchbearbetning för tabeller genom att ändra motsvarande tabellprincip. Mer information finns i IngestionBatching policy.
Notera
Om du inte anger alla parametrar för en PolicyObjectanges de ospecificerade parametrarna till standardvärden. Om du till exempel bara anger "MaximumBatchingTimeSpan" kommer "MaximumNumberOfItems" och "MaximumRawDataSizeMB" att anges till standard.
Du kan till exempel ändra appen så att den ändrar inmatningsbatchprincip timeout-värde till 30 sekunder genom att ändra ingestionBatching princip för MyStormEvents-tabellen med hjälp av följande kommando:
// Reduce the default batching timeout to 30 seconds
command = @$".alter-merge table {table} policy ingestionbatching '{{ ""MaximumBatchingTimeSpan"":""00:00:30"" }}'";
using (var response = kustoClient.ExecuteControlCommand(database, command, null))
{
PrintResultsAsValueList(command, response);
}
# Reduce the default batching timeout to 30 seconds
command = ".alter-merge table " + table + " policy ingestionbatching '{ \"MaximumBatchingTimeSpan\":\"00:00:30\" }'"
response = kusto_client.execute_mgmt(database, command)
print_result_as_value_list(command, response)
// Reduce the default batching timeout to 30 seconds
command = ".alter-merge table " + table + " policy ingestionbatching '{ \"MaximumBatchingTimeSpan\":\"00:00:30\" }'"
response = await kustoClient.executeMgmt(database, command)
printResultsAsValueList(command, response)
// Reduce the default batching timeout to 30 seconds
command = ".alter-merge table " + table + " policy ingestionbatching '{ \"MaximumBatchingTimeSpan\":\"00:00:30\" }'";
response = kusto_client.execute(database, command);
printResultsAsValueList(command, response.getPrimaryResults());
När du lägger till koden i din app och kör den bör du se ett resultat som liknar följande:
--------------------
Command: .alter-merge table MyStormEvents policy ingestionbatching '{ "MaximumBatchingTimeSpan":"00:00:30" }'
Result:
PolicyName - IngestionBatchingPolicy
EntityName - [YourDatabase].[MyStormEvents]
Policy - {
"MaximumBatchingTimeSpan": "00:00:30",
"MaximumNumberOfItems": 500,
"MaximumRawDataSizeMB": 1024
}
ChildEntities - None
EntityType - Table
Visa kvarhållningsprincipen på databasnivå
Du kan använda hanteringskommandon för att visa en databass kvarhållningsprincip.
Du kan till exempel ändra appen så att den kan visa databasens lagringspolicy med hjälp av följande kod. Resultatet bearbetas för att ta bort två kolumner från resultatet.
// Show the database retention policy (drop some columns from the result)
command = @$".show database {database} policy retention | project-away ChildEntities, EntityType";
using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
PrintResultsAsValueList(command, response);
}
# Show the database retention policy (drop some columns from the result)
command = ".show database " + database + " policy retention | project-away ChildEntities, EntityType"
response = kusto_client.execute_mgmt(database, command)
print_result_as_value_list(command, response)
// Show the database retention policy (drop some columns from the result)
command = ".show database " + database + " policy retention | project-away ChildEntities, EntityType"
response = await kustoClient.executeMgmt(database, command)
printResultsAsValueList(command, response)
// Show the database retention policy (drop some columns from the result)
command = ".show database " + database + " policy retention | project-away ChildEntities, EntityType";
response = kusto_client.execute(database, command);
printResultsAsValueList(command, response.getPrimaryResults());
När du lägger till koden i din app och kör den bör du se ett resultat som liknar följande:
--------------------
Command: .show database YourDatabase policy retention | project-away ChildEntities, EntityType
Result:
PolicyName - RetentionPolicy
EntityName - [YourDatabase]
Policy - {
"SoftDeletePeriod": "365.00:00:00",
"Recoverability": "Enabled"
}
Nästa steg