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
相关产品推荐
相关产品推荐

