BigQuery加载本地文件location配置异常及Job状态获取问题咨询
问题复现
复现BigQuery从本地文件加载数据的示例时遇到两类错误:
- 区域设为
us时,writer.job返回null - 区域设为其他值时,调用
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
有两个疑问:
- 上述逻辑该如何正确实现?
- 该API是否支持加载100MB大小的文件?
解决方案
核心问题排查
两类报错的原因如下:
- 非
us区域返回404:JobId指定的区域与目标表所在区域不匹配,之前创建的表默认在us区域,Job指定为其他区域时找不到对应资源就会报错。如果要将表放在europe-west2,需要在创建数据集/表时显式指定location参数,保证和后续作业的区域配置一致。 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
相关产品推荐
相关产品推荐

