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

BigQuery加载本地文件location配置异常及Job状态获取问题咨询

问题复现

复现BigQuery从本地文件加载数据的示例时遇到两类错误:

  1. 区域设为us时,writer.job返回null
  2. 区域设为其他值时,调用bigQuery.writer(job, writeChannelConfiguration)返回404

已验证正常的逻辑:

  • 服务连接正常
  • 可通过Java API创建表,但表的数据位置默认设为us,需要将位置设置为europe-west2,不清楚如何控制该配置

原始错误代码如下:

val table = createBigQueryTable(metadata, datasetName, tableName)
    log.info(s"table: $table")
    val tableId = table.getTableId
    log.info(s"tableId: $tableId")
// GenericData{classInfo=[datasetId, projectId, tableId], 
// {datasetId=my_dataset, projectId=my_project_id tableId=my_new_table}} 
    val writeChannelConfiguration: WriteChannelConfiguration = WriteChannelConfiguration
      .newBuilder(tableId)
      .setFormatOptions(FormatOptions.parquet())
      .build
    // 尝试过的区域参数:"us", "europe-west2", "US"
    val job = JobId.newBuilder().setLocation(location).build()
    // 除location = "us"外其他参数都报404
    // 但region为"us"时writer.getJob返回null
    val writer: TableDataWriteChannel = bigQuery.writer(job, writeChannelConfiguration)
    val stream: OutputStream = Channels.newOutputStream(writer)
    Files.copy(parquetGzipFile.toPath, stream)

    // 获取加载任务
    val jobInProgress = writer.getJob
    // location为"us"时此处返回null
   
    log.info(s"jobInProgress: $jobInProgress")

    val completedJob = jobInProgress.waitFor()
    log.info(s"completedJob: $completedJob")
    val stats = completedJob.getStatistics
    log.info(s"stats: $stats")
    stats

有两个疑问:

  1. 上述逻辑该如何正确实现?
  2. 该API是否支持加载100MB大小的文件?

解决方案

核心问题排查

两类报错的原因如下:

  1. 非us区域返回404:JobId指定的区域与目标表所在区域不匹配,之前创建的表默认在us区域,Job指定为其他区域时找不到对应资源就会报错。如果要将表放在europe-west2,需要在创建数据集/表时显式指定location参数,保证和后续作业的区域配置一致。
  2. us区域下writer.getJob()返回null:数据写完后没有关闭通道就直接查询作业,此时作业还未正式提交,自然拿不到作业对象;同时原始JobId没有显式指定项目ID和作业唯一标识,参数不全也会导致作业查询失败。

正确实现代码

调整后的可运行代码如下:

// 为JobId显式指定区域、项目参数
val jobId: JobId = JobId.newBuilder()
      .setLocation(location)
      .setProject(table.getTableId.getProject)
      // 底层自动生成UUID作为作业唯一ID
      .setRandomJob()
      .build()
    log.info(s"job: $jobId")
    val writer: TableDataWriteChannel = bigQuery.writer(jobId, writeChannelConfiguration)
    val stream: OutputStream = Channels.newOutputStream(writer)
    Files.copy(parquetGzipFile.toPath, stream)
    writer.close() // 必须关闭通道触发作业正式提交

    // 用显式生成的JobId查询作业状态
    val jobInProgress = bigQuery.getJob(jobId)
    log.info(s"jobInProgress: $jobInProgress")
    val completedJob = jobInProgress.waitFor()
    log.info(s"completedJob: $completedJob")
    val stats = completedJob.getStatistics.asInstanceOf[JobStatistics]
    log.info(s"stats: $stats")

100MB文件支持说明

该API完全支持加载100MB大小的文件,通过流方式上传本地文件加载到BigQuery的单文件上限为15GB,100MB的负载完全在合理范围内,无需额外分片处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:30:01