Как создать таблицу bigquery и импортировать из облачного хранилища с помощью ruby ​​api

Я пытаюсь создать таблицу в BigQuery - у меня есть один набор данных, и мне нужно использовать api для добавления таблицы и импорта данных (json.tar.gz) из облачного хранилища. Мне нужно использовать клиент Ruby для автоматизации всего процесса. У меня два вопроса:

  1. Я прочитал документы и попытался загрузить его (код ниже), но мне это не удалось, и я абсолютно не понимаю, что я делаю не так. Может ли кто-нибудь просветить меня или указать в правильном направлении?

  2. Как я узнаю, когда работа действительно завершена, после того, как я сделаю запрос? Из API, я полагаю, я хотел использовать запрос jobs.get? Не завершив первую часть, я не смог рассмотреть этот аспект.

Это мой код ниже.

config= {
  '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"
        },
        'createDisposition' => 'CREATE_IF_NEEDED',
        'maxBadRecords'=> 10,
      }
    },
    'jobReference'=>{'projectId'=>XXXXXXXXX}
  }

multipart_boundary="xxx"
body = "--#{multipart_boundary}\n"
body += "Content-Type: application/json; charset=UTF-8\n\n"
body += "#{config.to_json}\n"
body += "--#{multipart_boundary}\n"
body +="Content-Type: application/octet-stream\n\n"
body += "--#{multipart_boundary}--\n"

param_hash = {:api_method=> bigquery.jobs.insert }
param_hash[:parameters] = {'projectId' => 'XXXXXXXX'}
param_hash[:body] = body
param_hash[:headers] = {'Content-Type' => "multipart/related; boundary=#{multipart_boundary}"}

result = @client.execute(param_hash)
puts JSON.parse(result.response.header)

Я получаю следующую ошибку: {"error" => {"errors" => [{"domain" => "global", "reason" => "errorUrlForUpload», "message" => "Загрузки должны быть отправлены на URL загрузки. Повторно отправьте этот запрос на https://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobs "}]," code "=> 400," message "=>" Загрузки должны быть отправлены на URL загрузки. Повторно отправьте этот запрос на https://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobs "}}

Судя по заголовку запроса, он переходит к тому же URI, на который указывает ошибка, и я совершенно не понимаю, как действовать дальше. Любая помощь приветствуется.

Спасибо Вам и хорошего дня!


person Josh    schedule 13.11.2013    source источник


Ответы (2)


  1. Поскольку это запрос на «загрузку мультимедиа», существует несколько другой протокол для его выполнения. Рубиновый документ здесь http://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Upload описывает это более подробно. Я бы использовал возобновляемую загрузку, а не составную, потому что это проще.

  2. Да, как вы и подозревали, способ узнать, когда это будет сделано, - это выполнить jobs.get (), чтобы узнать статус выполняемого задания. Идентификатор задания будет возвращен в ответе jobs.insert (). Если вам нужен больший контроль, вы можете передать свой собственный идентификатор задания, чтобы в случае, если вызов jobs.insert () вернул ошибку, вы могли узнать, действительно ли задание было запущено.

person Jordan Tigani    schedule 14.11.2013

Спасибо за это. Ответ решен. См. Здесь: Как импортировать json из файла в облачном хранилище в Bigquery

Я думаю, что строка кода в документации для раздела возобновляемых загрузок (http://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Upload) следует читать:

result = client.execute(:api_method => drive.files.insert,

В противном случае эта строка выдаст ошибку с undefined 'результат':

upload = result.resumable_upload
person user2989892    schedule 14.11.2013