BigQuery 加载本地文件不起作用,位置有问题

Posted

技术标签:

【中文标题】BigQuery 加载本地文件不起作用,位置有问题【英文标题】:BigQuery load local file doesn't work, something wrong with location 【发布时间】:2021-10-17 23:13:25 【问题描述】:

试图复制这个例子: https://cloud.google.com/bigquery/docs/samples/bigquery-load-from-file

writer.job 对于“我们”位置为空 404 bigQuery.writer(job, writeChannelConfiguration) 用于任何其他位置

什么是有效的

连接工作 表是通过 java API 创建的,数据位置设置为 us(我不知道为什么)。有可能控制它吗?我更喜欢"europe-west2"

这是我的 scala 代码:

 val table = createBigQueryTable(metadata, datasetName, tableName)
    log.info(s"table: $table")
    val tableId = table.getTableId
    log.info(s"tableId: $tableId")
// GenericDataclassInfo=[datasetId, projectId, tableId], 
// datasetId=my_dataset, projectId=my_project_id tableId=my_new_table 
    val writeChannelConfiguration: WriteChannelConfiguration = WriteChannelConfiguration
      .newBuilder(tableId)
      .setFormatOptions(FormatOptions.parquet())
      .build
    // tried these locations: "us", "europe-west2", "US"
    val job = JobId.newBuilder().setLocation(location).build()
    // throws 404 for all except location = "us"
    // but writer.getJob is null for "us"
    val writer: TableDataWriteChannel = bigQuery.writer(job, writeChannelConfiguration)
    val stream: OutputStream = Channels.newOutputStream(writer)
    Files.copy(parquetGzipFile.toPath, stream)

    // Get load job
    val jobInProgress = writer.getJob
    // returns null for location = "us"
   
    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 会加载 100 mb 的文件吗?

更新:

回答解释了位置问题的原因 答案提供了有关工作状态轮询的线索

引用的示例由于某种原因不起作用。带有工作帮助的片段。

// Set location, project explicitly for JobId
val jobId: JobId = JobId.newBuilder()
      .setLocation(location)
      .setProject(table.getTableId.getProject)
      // generates UUID under the hood. 
      .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() // close it

    // Get load job by 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")

【问题讨论】:

【参考方案1】:

回答您关于 404 错误和writer.job“null”值的问题。

您遇到 404 错误,因为位置不匹配。您的数据集位于美国(如果未指定位置,则为默认值),并且您正尝试在其他位置运行作业。我建议如果您想在“europe-west2”中运行工作,数据集应在创建时位于“europe-west2”中。有关详细信息,请参阅specifying locations document。 请参阅creating a dataset,了解如何创建数据集并设置其位置。 您会得到 writer.job 的“null”值,因为作业对象没有 location 的字段。位置用作get job information 的输入。请参阅Job 的 REST 参考。如果您想获得location,您可以从dataset information 获得。请参阅Dataset 的 REST 参考。

API 应该能够加载 100MB 的文件,因为未压缩 CSV 的最大允许大小为 5TB。见CSV loading limits。

【讨论】:

以上是关于BigQuery 加载本地文件不起作用,位置有问题的主要内容,如果未能解决你的问题,请参考以下文章

使用本地文件通过 java 库加载 Google BigQuery 表

JQuery $.getJSON 加载本地 JSON 文件不起作用

如何将特定日期格式加载到 BigQuery

BigQuery:--[no]use_avro_logical_types 标志不起作用

为啥 MySQL 禁用加载本地 infile 不起作用?

bigrquery:使用 geoJSON 文件创建 BigQuery 表不起作用