【问题标题】:Putting all table names that a KQL query uses into a List in C#将 KQL 查询使用的所有表名放入 C# 中的列表中
【发布时间】:2022-08-14 20:44:14
【问题描述】:

假设我有一个使用多个表来检索数据的 KQL 查询。 我需要用 C# 编写一些代码,它将获取给定 KQL 查询使用的所有表,并将所有这些表名放入一个列表中。

简单地说:我需要分析每个 KQL 查询以了解它从哪些表中获取数据。

我已经尝试通过编写以下代码来做到这一点:

var query = \"Table1 | project a ,b,c\";
       var code = KustoCode.Parse(query);‏
var parseCode = code.Analyze();
Console.WriteLine(parseCode.ResultType.Display.ToString());

但这不会返回名称,而是返回此查询使用的名称,这不是我想要的。

如果您能帮我解决这个问题,我将不胜感激!

    标签: c# azure azure-data-explorer kql kusto-explorer


    【解决方案1】:

    这似乎可以解决问题(基于.show queryplan

    using System.Data;
    using Newtonsoft.Json.Linq;
    
    string query = @".show queryplan <| search in (database('*').*) * | summarize count() by $table";
    string cluster = "https://help.kusto.windows.net/Samples";
    
    using (var client = Kusto.Data.Net.Client.KustoClientFactory.CreateCslQueryProvider($"{cluster};Fed=true"))
    {
        using IDataReader reader = client.ExecuteQuery(query);
    
        reader.Read();
        reader.Read();
        string relop_tree = reader.GetString(2);
        JObject content = JObject.Parse(relop_tree);
    
        IEnumerable<JToken> sources = content.SelectTokens("$.source.operands..[?(@.source.type == 'TableShardReference')].source");
    
        foreach (JToken source in sources)
        {
            Console.WriteLine($"{source.Value<string>("database"), -50}{source.Value<string>("table")}");
        }
    }
    

    ContosoSales                                      SalesFact
    ContosoSales                                      Products
    ContosoSales                                      Customers
    ContosoSales                                      SalesTable
    KustoMonitoringPersistentDatabase                 KustoMonitoringTable
    SampleIoTData                                     RawSensorsData
    SampleIoTData                                     TransformedSensorsData
    SampleIoTData                                     _MV_LatestSensorValue
    SampleLogs                                        RawSysLogs
    SampleLogs                                        TransformedSysLogs
    SampleLogs                                        TraceLogs
    SampleLogs                                        TargetTable
    SampleMetrics                                     RawServerMetrics
    SampleMetrics                                     TransformedServerMetrics
    SampleMetrics                                     _MV_TransformedMetricsDedup
    SampleMetrics                                     SQLServerLocation
    SampleMetrics                                     _MV_AvgPerfWithServersHierarchy
    Samples                                           StormEvents
    Samples                                           demo_make_series1
    Samples                                           demo_series2
    Samples                                           demo_series3
    Samples                                           demo_many_series1
    Samples                                           ConferenceSessions
    Samples                                           demo_make_series2
    Samples                                           demo_clustering1
    Samples                                           Covid19_Bing
    Samples                                           Covid19_map2
    Samples                                           US_States
    Samples                                           US_Counties
    Samples                                           irregular_ts
    Samples                                           _MV_DailyCovid19
    Samples                                           demo_prometheus
    Samples                                           PopulationData
    Samples                                           OccupancyDetection
    Samples                                           SamplePowerRequirementHistorizedData
    

    【讨论】:

    • 删除这个答案。不幸的是,它似乎只与非常具体的查询有关。
    • 请取消接受此答案,以便我将其删除。谢谢
    【解决方案2】:

    我不相信这是先验已知的,因为某些表名可以在查询时解析,并且某些查询(例如使用 find)可以涵盖直到查询时才枚举的所有/多个表。

    如果您在 ADX 集群的 azure 门户视图中的“诊断设置”选项卡中打开表使用统计信息,您可以在事后不久找到此信息。这会将详细信息输入到应用洞察资源中,该资源将显示使用了哪些表/范围。

    【讨论】:

      【解决方案3】:

      谢谢您的帮助!我终于能够找到解决方案,所以这是我的代码:

      var code = KustoCode.Parse(query).Analyze();
      
      SyntaxElement.WalkNodes(code.Syntax,
             Operator =>
             {
                 if (Operator is Expression e && e.RawResultType is TableSymbol && Operator.Kind.ToString() == "NameReference")
                     tables.Add(e.ToString());
             })
      

      【讨论】:

        猜你喜欢
        • 2022-10-18
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多