You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过VB.NET高效将2800万条数据加载至BigQuery?

高效批量加载2800万条记录到BigQuery的VB.NET方案

方案一:使用BigQuery批量插入API

单条insert命令效率极低,换成批量插入能大幅提升速度,建议每个批次提交1000-5000条记录(可根据单条数据大小调整,避免批次过大超时)。使用Google官方的Google.Cloud.BigQuery.V2库,结合异步方法进一步优化吞吐量。

实现步骤:

  1. 安装NuGet包:Google.Cloud.BigQuery.V2
  2. 初始化BigQuery客户端(使用服务账号密钥)
  3. 分批读取本地数据,组装成BigQueryRow集合
  4. 调用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加载作业。

实现步骤:

  1. 安装NuGet包:Parquet.Net、Google.Cloud.BigQuery.V2、Google.Cloud.Storage.V1
  2. 将数据分批写入Parquet文件
  3. 上传Parquet文件到GCS
  4. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:35:29