0

ここの Python サンプル コードをモデルにした Python スクリプトを使用して、CSV ファイルを BigQuery に読み込もうとしています: https://developers.google.com/bigquery/docs/developers_guide

しかし、REST API を使用してテーブルをロードしようとすると、次のエラーが発生します。

{'status': '200', 'content-length': '1492', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'HTTP Upload Server Built on Jun 14 2012 02:12:09 (1339665129)', 'etag': '"tcivyOj9QvKAbuEJ5MEMf9we85w/-mxYhUDjvvydxcebR8fXI6l_5RQ"', 'pragma': 'no-cache', 'cache-control': 'no-cache, no-store, must-revalidate', 'date': 'Fri, 06 Jul 2012 22:30:55 GMT', 'content-type': 'application/json'}

{
 "kind": "bigquery#job",
 "etag": "\"tcivyOj9QvKAbuEJ5MEMf9we85w/-mxYhUDjvvydxcebR8fXI6l_5RQ\"",
 "id": "firespotter.com:firespotter:job_d6b99265278b4c0da9c3033acf39d6b2",
 "selfLink": "https://www.googleapis.com/bigquery/v2/projects/firespotter.com:firespotter/jobs/job_d6b99265278b4c0da9c3033acf39d6b2",
 "jobReference": {
  "projectId": "firespotter.com:firespotter",
  "jobId": "job_d6b99265278b4c0da9c3033acf39d6b2"
 },
 "configuration": {
  "load": {
   "schema": {
    "fields": [
     {
      "name": "date",
      "type": "STRING"
     },
     {
      "name": "time",
      "type": "STRING"
     },
     {
      "name": "call_uuid",
      "type": "STRING"
     },
     {
      "name": "log_level",
      "type": "STRING"
     },
     {
      "name": "file_line",
      "type": "STRING"
     },
     {
      "name": "message",
      "type": "STRING"
     }
    ]
   },
   "destinationTable": {
    "projectId": "385479794093",
    "datasetId": "telephony_logs",
    "tableId": "table_name"
   },
   "createDisposition": "CREATE_IF_NEEDED",
   "writeDisposition": "WRITE_TRUNCATE",
   "encoding": "UTF-8"
  }
 },
 "status": {
  "state": "DONE",
  "errorResult": {
   "reason": "notFound",
   "message": "Not Found: Dataset 385479794093:telephony_logs"
  },
  "errors": [
   {
    "reason": "notFound",
    "message": "Not Found: Dataset 385479794093:telephony_logs"
   }
  ]
 }
}

エラー「385479794093」にリストされている projectId は、渡した projectId ではなく、「プロジェクト番号」です。projectId は「firespotter.com:firespotter」である必要があります。

{
 "kind": "bigquery#datasetList",
 "etag": "\"tcivyOj9QvKAbuEJ5MEMf9we85w/ZMa8z6LKMgWZIqLWh3ti2SsSs4g\"",
 "datasets": [
  {
   "kind": "bigquery#dataset",
   "id": "firespotter.com:firespotter:telephony_logs",
   "datasetReference": {
    "datasetId": "telephony_logs",
    "projectId": "firespotter.com:firespotter"
   }
  }
 ]
}

3 つの異なる場所で正しい値を渡すと、REST API が独自の間違った projectId を提供しなければならないのはなぜですか? プロジェクト ID を渡すか、設定する必要がある別の場所はありますか?

参考までに、関連するコード スニペットを次に示します。

PROJECT = 'firespotter.com:firespotter'
DATASET = 'telephony_logs'


FLOW = OAuth2WebServerFlow(
    client_id='385479794093.apps.googleusercontent.com',
    client_secret='<a_secret_here>',
    scope='https://www.googleapis.com/auth/bigquery',
    user_agent='firespotter-upload-script/1.0')

def loadTable(http, projectId, datasetId, tableId, file_path, replace=False):
  url = "https://www.googleapis.com/upload/bigquery/v2/projects/" + projectId + "/jobs"
  # Create the body of the request, separated by a boundary of xxx
  mime_data = ('--xxx\n' +
            'Content-Type: application/json; charset=UTF-8\n' + '\n' +
            '{\n' +
            '   "projectId": "' + projectId + '",\n' +
            '   "configuration": {\n' +
            '     "load": {\n' +
            '       "schema": {\n' +
            '         "fields": [\n' +
            '          {"name":"date", "type":"STRING"},\n' +
            '          {"name":"time", "type":"STRING"},\n' +
            '          {"name":"call_uuid", "type":"STRING"},\n' +
            '          {"name":"log_level", "type":"STRING"},\n' +
            '          {"name":"file_line", "type":"STRING"},\n' +
            '          {"name":"message", "type":"STRING"}\n' +
            '        ]\n' +
            '      },\n' +
            '      "destinationTable": {\n' +
            '        "projectId": "' + projectId + '",\n' +
            '        "datasetId": "' + datasetId + '",\n' +
            '        "tableId": "' + tableId + '"\n' +
            '      },\n' +
            '     "createDisposition": "CREATE_IF_NEEDED",\n' +
            '     "writeDisposition": "' + ('WRITE_TRUNCATE' if replace else 'WRITE_APPEND') + '",\n' +
            '     "encoding": "UTF-8"\n' +
            '    }\n' +
            '  }\n' +
            '}\n' +
            '--xxx\n' +
            'Content-Type: application/octet-stream\n' +
            '\n')
  # Append data from the specified file to the request body
  f = open(file_path, 'r')
  header_line = f.readline()  # skip header line
  mime_data += f.read()

  # Signify the end of the body
  mime_data += ('--xxx--\n')

  headers = {'Content-Type': 'multipart/related; boundary=xxx'}
  resp, content = http.request(url, method="POST", body=mime_data, headers=headers)
  print str(resp) + "\n"
  print content

# --- Main ----------------------------------------------
def main(argv):

  csv_path = args[0]

  # If the credentials don't exist or are invalid, run the native client
  # auth flow. The Storage object will ensure that if successful the good
  # credentials will get written back to a file.
  storage = Storage('bigquery2_credentials.dat') # Choose a file name to store the credentials.
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = run(FLOW, storage)

  # Create an httplib2.Http object to handle our HTTP requests and authorize it
  # with our good credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

  loadTable(http, PROJECT, DATASET, 'table_name', csv_path, replace=True)

if __name__ == '__main__':
  main(sys.argv)
4

2 に答える 2

1

最近、プロジェクト ID を firespotter.com:firespotter に設定しましたか? プロジェクトが命名される前にデータセットが作成された場合、古いプロジェクト ID と新しいプロジェクト ID の間に不一致が生じます。プロジェクト ID を更新する自動システムがありますが、まだ実行されていないか、問題が発生している可能性があります (現在休暇中のため、確認できません)。うまくいけば、しばらくしてからもう一度やり直せばうまくいくでしょう。そうでない場合は、お知らせください。

于 2012-07-07T23:50:26.440 に答える
0

ここにいくつかの質問があります:

  • ロードジョブが失敗したのはなぜですか?確認するために、それはあなたが送信したリクエスト全体でしたか?sourceUrisその場合、ロードするデータがない、つまり空のように見えます。もしそうなら、それが問題であり、私たちは明らかに世界最悪のエラーメッセージを返しています。

  • なぜ数値のプロジェクトIDなのですか?BigQueryはプロジェクト名と関連する数値IDを同じ意味で使用するため、表示されるのは、途中でプロジェクト名をIDに変換する傾向があることだけです。確認のために、Google APIコンソールにアクセスしてプロジェクトを検索すると、 URLに同じ数値IDが表示されますか?

  • プロジェクトIDが複数の場所で指定されるのはなぜですか?まず、プロジェクトIDをジョブの最上位属性として指定したようです。それは必要ないはずです。(これは、ジョブ参照自体で指定したプロジェクトIDを単にオーバーライドするだけだと思います。)これにより、2つの場所が残ります。1つはジョブ参照の一部として、もう1つはテーブル参照の一部としてです。これらは実際には2つの異なることを意味します。1つはジョブを挿入するプロジェクト、つまり誰がジョブの料金を支払うかを指定し、もう1つはテーブル内の1つは結果のテーブルが存在するプロジェクト、つまり誰が所有するかを指定します。結果のデータ。一般に、これらは同じですが、APIを使用して区別することができます。(これは、たとえば、最終的に顧客が所有するテーブルにデータを挿入する必要があるサービスを構築した場合に役立ちます。)

于 2012-07-07T05:04:22.707 に答える