-1

BigQuery의 insert API를 호출하여 테이블에 데이터를 삽입하는 python 스크립트를 작성했습니다. OAuth 인증을 위해 서비스 계정을 사용합니다. 며칠 동안 제대로 작동했지만 이제는 로그인 필요 오류 (401)가 나타납니다. 되는 다음 코드 :로그인 서비스 계정을 사용하는 데 필요한 오류 Google BigQuery API

{ 

"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 

답변

0

작업 본문에있는 쿼리의 출력 스키마/형식이 삽입 API를 통해 데이터가 삽입 된 테이블의 스키마와 일치하지 않는 것이 문제였습니다. 작업 본문에서 실행 된 쿼리에 약간의 변경이있었습니다. 쿼리

출력 포맷는 출력 데이터의 테이블 스키마 같은 동일한 삽입되어야 할 것이다.

0

서비스 계정 아무튼 나는 UI에 작업 로그를 확인 때 다음과 같은 오류를 볼

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() 

문제의 큰 쿼리 프로젝트에 액세스 할 수있는 권한이 없습니다. 서비스 계정은 사용자가 아니며 사전 인증을 받아야합니다.

다른 사용자에게 프로젝트 액세스 권한을 부여 할 수는 있지만 서비스 계정 이메일 주소를 사용하여 사용자로 추가 할 수 있는지는 잘 모릅니다.

이것은 서비스 계정 코드 작업에 따라 달라집니다. 내 비단 솜씨 기술은 제한적이다. 나는 그 권리를 떠맡을 것이다.

+0

서비스 계정 전자 메일 주소가 이미 편집자 권한이있는 프로젝트 사용자 대시 보드에 추가되어 있습니다. 오늘까지 제대로 작동했기 때문에 OAuth 토큰 만료일이 될 수 있습니까? – Prabhjot

+0

서비스 계정은 액세스 권한이 있고 프로젝트가 Google 개발자 콘솔에서 삭제되거나 재생성되지 않은 한 만료되지 않습니다. – DaImTo

+0

둘 중 아무 것도 발생하지 않았습니다. 별도의 로컬 서버에서 코드를 실행하고 있습니다. 그게 효과가 있니? – Prabhjot

관련 문제