如何通过VB.NET高效将2800万条数据加载至BigQuery?
高效批量加载2800万条记录到BigQuery的VB.NET方案
方案一:使用BigQuery批量插入API
单条insert命令效率极低,换成批量插入能大幅提升速度,建议每个批次提交1000-5000条记录(可根据单条数据大小调整,避免批次过大超时)。使用Google官方的Google.Cloud.BigQuery.V2库,结合异步方法进一步优化吞吐量。
实现步骤:
- 安装NuGet包:
Google.Cloud.BigQuery.V2 - 初始化BigQuery客户端(使用服务账号密钥)
- 分批读取本地数据,组装成
BigQueryRow集合 - 调用
InsertRowsAsync批量提交
VB.NET代码示例:
Imports Google.Cloud.BigQuery.V2 Imports System.Threading.Tasks Module BigQueryBatchInsert Async Sub BatchLoadData() ' 初始化客户端 Dim projectId = "你的项目ID" Dim datasetId = "你的数据集ID" Dim tableId = "你的表ID" Dim client = BigQueryClient.Create(projectId, "你的服务账号密钥路径") Dim table = client.GetTable(datasetId, tableId) ' 模拟分批读取数据(实际从数据库/文件读取) Dim batchSize = 2000 Dim totalRecords = 28000000 Dim currentRecord = 0 While currentRecord < totalRecords Dim batch = New List(Of BigQueryRow)() ' 填充当前批次数据 For i = 0 To batchSize - 1 If currentRecord >= totalRecords Then Exit For Dim row = New BigQueryRow() ' 假设表有id、name、value三个字段 row("id") = currentRecord + 1 row("name") = $"Name_{currentRecord + 1}" row("value") = currentRecord + 1000 batch.Add(row) currentRecord += 1 Next ' 批量插入 Await table.InsertRowsAsync(batch) Console.WriteLine($"已插入 {currentRecord}/{totalRecords} 条记录") End While End Sub End Module
方案二:导出为Parquet文件后用加载作业导入
对于2800万条数据,文件加载作业是效率最高的方式,尤其是使用Parquet格式(列式存储,压缩率高,BigQuery解析速度快)。步骤分为:生成Parquet文件 → 上传到Google Cloud Storage(GCS) → 提交BigQuery加载作业。
实现步骤:
- 安装NuGet包:
Parquet.Net、Google.Cloud.BigQuery.V2、Google.Cloud.Storage.V1 - 将数据分批写入Parquet文件
- 上传Parquet文件到GCS
- 创建BigQuery加载作业,从GCS导入数据
VB.NET代码示例:
生成Parquet文件:
Imports Parquet Imports Parquet.Schema Imports System.IO Module ParquetGenerator Sub GenerateParquetFile(filePath As String, data As List(Of YourDataModel)) ' 定义Parquet schema,匹配BigQuery表结构 Dim schema = new ParquetSchema( new DataField(Of Integer)("id"), new DataField(Of String)("name"), new DataField(Of Integer)("value") ) ' 写入文件 Using stream = File.Create(filePath) Using writer = new ParquetWriter(schema, stream) Using rowGroupWriter = writer.CreateRowGroup() rowGroupWriter.WriteColumn( new DataColumn( schema.GetDataField("id"), data.Select(Function(d) d.Id).ToArray() ) ) rowGroupWriter.WriteColumn( new DataColumn( schema.GetDataField("name"), data.Select(Function(d) d.Name).ToArray() ) ) rowGroupWriter.WriteColumn( new DataColumn( schema.GetDataField("value"), data.Select(Function(d) d.Value).ToArray() ) ) End Using End Using End Using End Sub ' 数据模型类 Class YourDataModel Public Property Id As Integer Public Property Name As String Public Property Value As Integer End Class End Module
上传到GCS并提交加载作业:
Imports Google.Cloud.BigQuery.V2 Imports Google.Cloud.Storage.V1 Imports System.Threading.Tasks Module BigQueryLoadJob Async Sub LoadFromGcs() Dim projectId = "你的项目ID" Dim datasetId = "你的数据集ID" Dim tableId = "你的表ID" Dim gcsBucket = "你的GCS桶名" Dim gcsFilePath = "parquet_files/data_001.parquet" Dim localParquetPath = "本地文件路径/data_001.parquet" ' 上传文件到GCS Dim storageClient = StorageClient.Create("你的服务账号密钥路径") Await storageClient.UploadObjectAsync(gcsBucket, gcsFilePath, "application/octet-stream", File.OpenRead(localParquetPath)) ' 提交加载作业 Dim bigQueryClient = BigQueryClient.Create(projectId, "你的服务账号密钥路径") Dim loadJob = bigQueryClient.CreateLoadJob( sourceUri:= $"gs://{gcsBucket}/{gcsFilePath}", destination:= bigQueryClient.GetTable(datasetId, tableId), format:= FileFormat.Parquet ) ' 等待作业完成 Await loadJob.PollUntilCompletedAsync() Console.WriteLine("加载作业完成,已导入数据:" & loadJob.Statistics.LoadedRows) End Sub End Module
注意事项:
- 服务账号需拥有BigQuery数据编辑权限和GCS读写权限
- Parquet文件建议按1GB左右拆分,避免单个文件过大
- 批量插入时需处理重试逻辑,避免网络波动导致数据丢失
- 加载作业支持自动分片并行处理,适合超大规模数据
内容的提问来源于stack exchange,提问作者Wairhard
相关产品推荐
相关产品推荐

