Table of Contents

从 Metric View 中移除对象

本文演示如何从已加载的 Metric View 中移除其维度。 类似的方法适用于 Metric View 中的所有集合。

对这些代码示例的 Metric View 进行反序列化

本操作指南使用一个示例电商 Metric View 来表示销售数据,其中三个维度表(product、customer、date)连接到一个事实表(orders)。 如果你想在阅读本操作指南其余部分时跟着代码一起操作,请先运行下面的代码片段

SemanticBridge.MetricView.Deserialize("""
    version: 0.1
    source: sales.fact.orders
    joins:
      - name: product
        source: sales.dim.product
        on: source.product_id = product.product_id
      - name: customer
        source: sales.dim.customer
        on: source.customer_id = customer.customer_id
      - name: date
        source: sales.dim.date
        on: source.order_date = date.date_key
    dimensions:
      - name: product_name
        expr: product.product_name
      - name: product_category
        expr: product.category
      - name: customer_segment
        expr: customer.segment
      - name: order_date
        expr: date.full_date
      - name: order_year
        expr: date.year
      - name: order_month
        expr: date.month_name
    measures:
      - name: total_revenue
        expr: SUM(revenue)
      - name: order_count
        expr: COUNT(order_id)
      - name: avg_order_value
        expr: AVG(revenue)
      - name: unique_customers
        expr: COUNT(DISTINCT customer_id)
    """);
Note

这里的每个移除脚本都会影响当前已加载的 Metric View。 如果你想把这些脚本都运行一遍,请确保在每次移除操作前都先运行上面的 Deserialize

按名称移除

找到要移除的 Metric View 维度,并将其从集合中移除:

var view = SemanticBridge.MetricView.Model;

var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");

var dimToRemove = view.Dimensions.FirstOrDefault(d => d.Name == "order_month");
if (dimToRemove != null)
{
    view.Dimensions.Remove(dimToRemove);
    sb.AppendLine($"Removed: {dimToRemove.Name}");
}

sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
Output(sb.ToString());

输出:

Dimensions before: 6
Removed: order_month
Dimensions after: 5

注意:如果你连续运行两次上述脚本,不会再移除任何内容;移除前后计数都会是 5。

移除多个 Metric View 维度

使用 LINQ 进行筛选并重建集合:

using MetricView = TabularEditor.SemanticBridge.Platforms.Databricks.MetricView;

var view = SemanticBridge.MetricView.Model;

var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");

// Remove all date-related dimensions
string[] toRemove = ["order_date", "order_year", "order_month"];

var toKeep = view.Dimensions
    .Where(d => !toRemove.Contains(d.Name))
    .ToList();

// Clear and repopulate
view.Dimensions.Clear();
foreach (var dim in toKeep)
{
    view.Dimensions.Add(dim);
}

sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
sb.AppendLine();
sb.AppendLine("Remaining dimensions:");
sb.AppendLine("---------------------");
foreach (var dim in view.Dimensions)
{
    sb.AppendLine($"  {dim.Name}");
}

Output(sb.ToString());

输出:

移除前维度数:6
移除后维度数:3

剩余维度:
---------------------
  product_name
  product_category
  customer_segment

从指定表中移除 Metric View 维度

移除所有引用日期表的 Metric View 维度。

Warning

此示例不保证能够移除所有且仅移除引用给定 Metric View Join 的 Metric View 维度。 Metric View 维度可能包含近乎任意的 SQL 表达式,也可能引用先前定义的 Metric View 维度。 此示例仅用于说明。

var view = SemanticBridge.MetricView.Model;

var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");

var toRemove = view.Dimensions
    .Where(d => d.Expr.StartsWith("date."))
    .ToList();

foreach (var dim in toRemove)
{
    view.Dimensions.Remove(dim);
    sb.AppendLine($"Removed: {dim.Name} ({dim.Expr})");
}

sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
Output(sb.ToString());

输出:

移除前维度数:6
已移除:order_date (date.full_date)
已移除:order_year (date.year)
已移除:order_month (date.month_name)
移除后维度数:3

另请参阅