从列式数据库获取列数据
发布: (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# 只需读取包含数组的单行 → 快速、简洁且高效。