API クライアントを Ruby で動作させてジョブ挿入を実行し、クラウド ストレージからデータを取得して BigQuery のテーブルに配置しようとしてきましたが、あまり成功していません。以前、私は Python API を見て、Ruby で物事を進めてきましたが、これは私を困惑させます。
import httplib2
import urllib2
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
def loadTable(service, projectId, datasetId, targetTableId):
try:
jobCollection = service.jobs()
jobData = {
'projectId': XXXXXXXXX,
'configuration': {
'load': {
'sourceUris': ["gs://person-bucket/person_json.tar.gz"],
'schema': {
'fields'=> [
{ 'name'=>'person_id', 'type'=>'integer' },
{ 'name'=> 'person_name', 'type'=>'string' },
{ 'name'=> 'logged_in_at', 'type'=>'timestamp' },
]
},
'destinationTable': {
'projectId': XXXXXXXXX,
'datasetId': 'personDataset',
'tableId': 'person'
},
}
}
}
insertResponse = jobCollection.insert(projectId=projectId, body=jobData).execute()
# Ping for status until it is done, with a short pause between calls.
import time
while True:
job = jobCollection.get(projectId=projectId,
jobId=insertResponse['jobReference']['jobId']).execute()
if 'DONE' == job['status']['state']:
print 'Done Loading!'
return
print 'Waiting for loading to complete...'
time.sleep(10)
if 'errorResult' in job['status']:
print 'Error loading table: ', pprint.pprint(job)
return
except urllib2.HTTPError as err:
print 'Error in loadTable: ', pprint.pprint(err.resp)
PROJECT_NUMBER = 'XXXXXXXXX'
SERVICE_ACCOUNT_EMAIL = 'XXXXXXXXX@developer.gserviceaccount.com'
f = file('key.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
SERVICE_ACCOUNT_EMAIL,
key,
scope='https://www.googleapis.com/auth/bigquery')
http = httplib2.Http()
http = credentials.authorize(http)
service = build('bigquery', 'v2')
tables = service.tables()
response = tables.list(projectId=PROJECT_NUMBER, datasetId='person_dataset').execute(http)
print(response)
print("-------------------------------")
loadTable(service, PROJECT_NUMBER, "person_dataset", "person_table")
テーブルのリストを要求すると、承認されている必要があり、テーブルの詳細を表示できますが、クラウド ストレージからインポートされたデータを使用してテーブルを作成できないようです。
これは、コンソールに表示される出力です。
No handlers could be found for logger "oauth2client.util"
{u'totalItems': 2, u'tables': [{u'kind': u'bigquery#table', u'id': u'xxx:xxx.xxx', u'tableReference': {u'projectId': u'xxx', u'tableId': u'xxx', u'datasetId': u'xxx'}}, {u'kind': u'bigquery#table', u'id': u'xxx:xxx.yyy', u'tableReference': {u'projectId': u'xxx', u'tableId': u'yyy', u'datasetId': u'xxx'}}], u'kind': u'bigquery#tableList', u'etag': u'"zzzzzzzzzzzzzzzz"'}
Traceback (most recent call last):
File "test.py", line 96, in <module>
loadTable(service, PROJECT_NUMBER, "person_dataset", "person_table")
File "test.py", line 50, in loadTable
body=jobData).execute()
File "/usr/local/lib/python2.7/dist-packages/oauth2client-1.2-py2.7.egg/oauth2client/util.py", line 132, in positional_wrapper
return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/google_api_python_client-1.2-py2.7.egg/apiclient/http.py", line 723, in execute
raise HttpError(resp, content, uri=self.uri)
apiclient.errors.HttpError: <HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/xxxxxxxx/jobs?alt=json returned "Login Required">
誰かが私が間違っていることを教えてくれますか、正しい方向に向けてくれますか?
どんな助けでも本当に感謝しています。
素晴らしい一日をありがとう。