从列式数据库获取列数据

发布: (2025年12月10日 GMT+8 13:01)
2 min read
原文: Dev.to

Source: Dev.to

问题

在 C# 中逐行获取 BigQuery 数据并手动构建数组会导致:

  • 大数据集时性能慢
  • CPU 使用率高
  • 内存消耗大
  • 对高容量表效率低下

理想的结构是:

export interface DealData {
  Season: number[];
  countryOfProduction: string[];
  productionGroup: string[];
  supplierName: string[];
  dealTypes: string[];
}

最佳实践:让 BigQuery 构建数组(使用 ARRAY_AGG

不要在 C# 中检索大量行后再聚合,而是让 BigQuery 返回每列对应数组的单行结果,使用 ARRAY_AGG

优化后的 BigQuery SQL

SELECT
  ARRAY_AGG(Season) AS Season,
  ARRAY_AGG(countryOfProduction) AS countryOfProduction,
  ARRAY_AGG(productionGroup) AS productionGroup,
  ARRAY_AGG(supplierName) AS supplierName,
  ARRAY_AGG(dealTypes) AS dealTypes
FROM your_dataset.your_table;

好处

  • 只返回一行。
  • 聚合在 BigQuery 中并行完成。
  • 更快且更节省内存。
  • C# 中几乎不需要额外处理。

C# 示例:从 BigQuery 读取聚合后的数组

using Google.Cloud.BigQuery.V2;
using Newtonsoft.Json;

public class DealData
{
    public List Season { get; set; } = new();
    public List countryOfProduction { get; set; } = new();
    public List productionGroup { get; set; } = new();
    public List supplierName { get; set; } = new();
    public List dealTypes { get; set; } = new();
}

public async Task<string> GetDealDataAsync()
{
    BigQueryClient client = BigQueryClient.Create("your-project-id");

    string query = @"
        SELECT
          ARRAY_AGG(Season) AS Season,
          ARRAY_AGG(countryOfProduction) AS countryOfProduction,
          ARRAY_AGG(productionGroup) AS productionGroup,
          ARRAY_AGG(supplierName) AS supplierName,
          ARRAY_AGG(dealTypes) AS dealTypes
        FROM your_dataset.your_table
    ";

    var result = client.ExecuteQuery(query, null);
    var row = result.First();

    DealData dealData = new DealData
    {
        Season = row["Season"].ToList(),
        countryOfProduction = row["countryOfProduction"].ToList(),
        productionGroup = row["productionGroup"].ToList(),
        supplierName = row["supplierName"].ToList(),
        dealTypes = row["dealTypes"].ToList()
    };

    return JsonConvert.SerializeObject(dealData);
}

小结

  • BigQuery 采用列式存储,针对分析型工作负载进行了优化。
  • 避免在 C# 中遍历行进行处理。
  • 使用 ARRAY_AGG 让 BigQuery 完成列级聚合。
  • C# 只需读取包含数组的单行 → 快速、简洁且高效。
Back to Blog

相关文章

阅读更多 »