使用服务帐户 Google BigQuery API 需要登录错误
Login Required error using service account Google BigQuery API
我写了一个 python 脚本,调用 BigQuery 的插入 API 将数据插入 table。我使用服务帐户进行 OAuth 身份验证。它可以正常运行几天,但现在出现需要登录错误 (401)。以下是代码:
scopes = ['https://www.googleapis.com/auth/bigquery']
credentials =ServiceAccountCredentials.from_json_keyfile_name('/home/ubuntu/aha/udofy.json', scopes=scopes)
service = discovery.build('bigquery', 'v2', credentials=credentials)
job_body = { } #Body JSON
request = service.jobs().insert(projectId=projectId, body=job_body)
response = request.execute()
我在 UI 上检查作业日志时看到以下错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Login Required",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Login Required"
}
}
API 响应:
{u'configuration': {u'query': {u'createDisposition': u'CREATE_IF_NEEDED',
u'destinationTable': {u'datasetId': u'co_gradeup_android_ANDROID',
u'projectId': u'udofy-1021',
u'tableId': u'user_answer_attempts'},
u'query': u' SELECT user_dim.user_id as user_id, event_dim.params.value.string_value as post_id, DATE(USEC_TO_TIMESTAMP(event_dim.timestamp_micros)) as attempt_date, count(*) as attempt_count FROM [udofy-1021:co_gradeup_android_ANDROID.app_events_20161101] WHERE event_dim.name =\'Answer_Selected\' and event_dim.params.key = \'postId\' and user_dim.user_id is not null and user_dim.user_id != "" group by 1,2,3 ',
u'writeDisposition': u'WRITE_APPEND'}},
u'etag': u'', #User_etag
u'id': u'', #User_Id
u'jobReference': {u'jobId': u'job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
u'projectId': u'udofy-1021'},
u'kind': u'bigquery#job',
u'selfLink': u'https://www.googleapis.com/bigquery/v2/projects/udofy-1021/jobs/job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
u'statistics': {u'creationTime': u'1478082742163',
u'startTime': u'1478082742420'},
u'status': {u'state': u'RUNNING'},
u'user_email': u''} #service_account_email
服务帐户无权访问有问题的大查询项目。服务账号不是你,需要预授权
不知道您是否可以授予其他用户访问项目的权限,但您是否可以获取服务帐户电子邮件地址并将其添加为用户。
这完全取决于您的服务帐户代码是否有效。我的 python 技能有限我将不得不承担它的权利。
问题是作业正文中查询的输出 schema/format 与通过插入 API 插入数据的 table 的架构不匹配.在作业正文中执行的查询发生了细微变化。
查询的输出格式应该与table模式[=]完全相同必须插入输出数据中的 17=]。
我写了一个 python 脚本,调用 BigQuery 的插入 API 将数据插入 table。我使用服务帐户进行 OAuth 身份验证。它可以正常运行几天,但现在出现需要登录错误 (401)。以下是代码:
scopes = ['https://www.googleapis.com/auth/bigquery']
credentials =ServiceAccountCredentials.from_json_keyfile_name('/home/ubuntu/aha/udofy.json', scopes=scopes)
service = discovery.build('bigquery', 'v2', credentials=credentials)
job_body = { } #Body JSON
request = service.jobs().insert(projectId=projectId, body=job_body)
response = request.execute()
我在 UI 上检查作业日志时看到以下错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Login Required",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Login Required"
}
}
API 响应:
{u'configuration': {u'query': {u'createDisposition': u'CREATE_IF_NEEDED',
u'destinationTable': {u'datasetId': u'co_gradeup_android_ANDROID',
u'projectId': u'udofy-1021',
u'tableId': u'user_answer_attempts'},
u'query': u' SELECT user_dim.user_id as user_id, event_dim.params.value.string_value as post_id, DATE(USEC_TO_TIMESTAMP(event_dim.timestamp_micros)) as attempt_date, count(*) as attempt_count FROM [udofy-1021:co_gradeup_android_ANDROID.app_events_20161101] WHERE event_dim.name =\'Answer_Selected\' and event_dim.params.key = \'postId\' and user_dim.user_id is not null and user_dim.user_id != "" group by 1,2,3 ',
u'writeDisposition': u'WRITE_APPEND'}},
u'etag': u'', #User_etag
u'id': u'', #User_Id
u'jobReference': {u'jobId': u'job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
u'projectId': u'udofy-1021'},
u'kind': u'bigquery#job',
u'selfLink': u'https://www.googleapis.com/bigquery/v2/projects/udofy-1021/jobs/job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
u'statistics': {u'creationTime': u'1478082742163',
u'startTime': u'1478082742420'},
u'status': {u'state': u'RUNNING'},
u'user_email': u''} #service_account_email
服务帐户无权访问有问题的大查询项目。服务账号不是你,需要预授权
不知道您是否可以授予其他用户访问项目的权限,但您是否可以获取服务帐户电子邮件地址并将其添加为用户。
这完全取决于您的服务帐户代码是否有效。我的 python 技能有限我将不得不承担它的权利。
问题是作业正文中查询的输出 schema/format 与通过插入 API 插入数据的 table 的架构不匹配.在作业正文中执行的查询发生了细微变化。
查询的输出格式应该与table模式[=]完全相同必须插入输出数据中的 17=]。