我一直在尝试创建一项工作,以便将来自Google云端存储的压缩json文件加载到Google BigQuery表。我在Google云端存储和Google BigQuery中都具有读/写访问权限。此外,上传的文件与BigQuery属于同一个项目。
当我通过 POST 请求访问此网址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或放置在身份验证标头中的访问令牌中,因为我之前已经成功创建了一个空表。另外,我将内容类型标题指定为application/json
,我认为这不是问题,因为正文内容应该是json编码的。
提前致谢
答案 0 :(得分:1)
您的HTTP请求格式错误--BigQuery根本不会将此识别为加载作业。 您需要查看POST请求,并检查您发送的正文。
您需要确保以上所有(接缝正确)是POST调用的body
。上面的Json
应该在一行上,如果您手动创建多部分邮件,请确保每种MIME类型的标题和正文之间都有一个额外的换行符。
如果您正在使用某种类型的库,请确保不要使用其他形式的主体,例如资源,内容或正文。我见过以不同方式使用这些库的库。
试用BigQuery API资源管理器:https://developers.google.com/bigquery/docs/reference/v2/jobs/insert并确保您的请求正文与API所做的匹配。