将存储在 Google Cloud Storage 中的文件加载到 Big Query 时出错

Posted

技术标签:

【中文标题】将存储在 Google Cloud Storage 中的文件加载到 Big Query 时出错【英文标题】:Error loading file stored in Google Cloud Storage to Big Query 【发布时间】:2014-07-09 03:02:40 【问题描述】:

我一直在尝试创建一个作业以将压缩的 json 文件从 Google Cloud Storage 加载到 Google BigQuery 表。我在 Google Cloud Storage 和 Google BigQuery 中都有读/写权限。此外,上传的文件与 BigQuery 属于同一项目。

当我通过 POST 请求访问此 url https://www.googleapis.com/upload/bigquery/v2/projects/NUMERIC_ID/jobs 后面的资源时,就会出现问题。对上述资源的请求内容如下:


"kind" : "bigquery#job",
"projectId" : NUMERIC_ID,
"configuration": 
    "load": 
        "sourceUris": ["gs://bucket_name/document.json.gz"],
        "schema": 
            "fields": [
                
                    "name": "id",
                    "type": "INTEGER"
                ,
                
                    "name": "date",
                    "type": "TIMESTAMP"
                ,
                
                    "name": "user_agent",
                    "type": "STRING"
                ,
                
                    "name": "queried_key",
                    "type": "STRING"
                ,
                
                    "name": "user_country",
                    "type": "STRING"
                ,
                
                    "name": "duration",
                    "type": "INTEGER"
                ,
                
                    "name": "target",
                    "type": "STRING"
                
            ]
        ,
        "destinationTable": 
            "datasetId": "DATASET_NAME",
            "projectId": NUMERIC_ID,
            "tableId": "TABLE_ID"
        
    

但是,错误没有任何意义,也可以在下面找到:


    "error": 
        "errors": [
            
                "domain": "global",
                "reason": "invalid",
                "message": "Job configuration must contain exactly one job-specific configuration object (e.g., query, load, extract, spreadsheetExtract), but there were 0: "
            
        ],
        "code": 400,
        "message": "Job configuration must contain exactly one job-specific configuration object (e.g., query, load, extract, spreadsheetExtract), but there were 0: "
    

我知道问题不在于项目 ID 或放置在身份验证标头中的访问令牌,因为我之前已经成功创建了一个空表。此外,我将 content-type 标头指定为 application/json,我认为这不是问题所在,因为正文内容应该是 json 编码的。

提前致谢

【问题讨论】:

我觉得这个请求没问题。架构中“目标”字段的末尾有一个额外的逗号,这可能会使 API 认为您有 0 个作业配置。 谢谢,但是那个逗号是一个错字,因为我删除了架构中的更多元素,以使问题的正文更简单。问题依然存在。 【参考方案1】:

您的 HTTP 请求格式不正确 - BigQuery 根本不会将其识别为加载作业。 您需要查看 POST 请求,并检查您发送的正文。

您需要确保以上所有内容(接缝正确)都是 POST 调用的body。上面的Json 应该在一行中,如果您手动创建多部分消息,请确保在每个 MIME 类型的标题和正文之间有一个额外的换行符。

如果您使用某种库,请确保正文不是其他形式的,例如资源、内容或正文。我见过使用这些不同的库。

试用 BigQuery API 资源管理器:https://developers.google.com/bigquery/docs/reference/v2/jobs/insert 并确保您的请求正文与 API 生成的内容相匹配。

【讨论】:

我按照提供的链接,发现它有效。不同之处在于他们不使用上传端点(他们使用googleapis.com/bigquery/v2/projects/NUMERIC_ID/jobs 而不是googleapis.com/upload/bigquery/v2/projects/NUMERIC_ID/jobs)。此外,他们添加了一个名为key 的查询参数,该参数必须等于访问令牌。它仍然没有任何意义,但至少它有效。谢谢

以上是关于将存储在 Google Cloud Storage 中的文件加载到 Big Query 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 S3 存储桶复制到 Google Cloud Storage

从 Google Cloud Function (Python) 将新文件写入 Google Cloud Storage 存储桶

如何将文件从加密的 S3 存储桶复制到 Google Cloud Storage?

如何在使用 gsutil 保留 ACL 的同时将文件从 Google Cloud Storage 存储桶 1 复制到存储桶 2

在 Google Cloud Storage 中存储像数据一样的键值

如何使用 Node.js 将 base64 编码图像(字符串)直接上传到 Google Cloud Storage 存储桶?