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

Golang加载多条JSON数据至BigQuery求助(免文件存储)

BigQuery JSON批量加载问题解决(Go语言)

问题梳理

  • 作为Go新手,尝试将JSON数据加载到BigQuery时遇到无效JSON格式问题,仅能加载单条数据,无法批量加载
  • 希望避免将数据保存为JSON文件后再加载
  • client.Dataset(datasetID).Table(tableID).Inserter()要求表提前存在,不符合需求,想确认是否可通过Loader实现自动建表+批量加载

修正后的代码

package main

import (
    "context"
    "fmt"
    "strings"

    "cloud.google.com/go/bigquery"
)

type bqSchema struct {
    Name    string
    Age     int
}

func uploadJSONTruncate(projectID, datasetID, tableID, dataString string) error {
    ctx := context.Background()
    client, err := bigquery.NewClient(ctx, projectID)
    if err != nil {
        return fmt.Errorf("bigquery.NewClient: %v", err)
    }
    defer client.Close()

    schema, err := bigquery.InferSchema(bqSchema{})
    if err != nil {
        return fmt.Errorf("bigquery.InferSchema: %v", err)
    }

    rs := bigquery.NewReaderSource(strings.NewReader(dataString))
    rs.FileConfig.SourceFormat = bigquery.JSON
    rs.FileConfig.Schema = schema
    loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(rs)
    loader.WriteDisposition = bigquery.WriteTruncate
    loader.CreateDisposition = bigquery.CreateIfNeeded

    job, err := loader.Run(ctx)
    if err != nil {
        return err
    }
    status, err := job.Wait(ctx)
    if err != nil {
        return err
    }
    if status.Err() != nil {
        return fmt.Errorf("job completed with error: %v", status.Err())
    }

    return nil
}

func main() {
    projectID := "dummy-project"
    datasetID := "dummy-dataset"
    tableID := "testTable"
    // 修正为JSON Lines格式:每行一条独立JSON对象
    dataString := `{"Name": "A", "Age": 11}
{"Name": "B", "Age": 22}`

    err := uploadJSONTruncate(projectID, datasetID, tableID, dataString)
    if err != nil {
        fmt.Println(err)
    }
}

关键说明

  • JSON格式修正:BigQuery的JSON数据源要求采用JSON Lines格式,即每行一条独立的JSON对象,不能使用JSON数组包裹,也不需要转义换行符。原代码中的数组格式是无效的,改为换行分隔的单条JSON即可批量加载。
  • Loader自动建表:通过设置loader.CreateDisposition = bigquery.CreateIfNeeded,Loader会自动检查表是否存在,不存在则根据指定的Schema创建表,满足无需提前建表的需求。
  • 无文件加载实现:使用strings.NewReader将JSON字符串转换为io.Reader,直接传入bigquery.NewReaderSource,无需将数据写入本地文件再加载。

内容的提问来源于stack exchange,提问作者IanJay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:19:01