Как да създадете таблица на 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"=>"wrongUrlForUpload", "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. Тъй като това е заявка за „качване на мултимедия“, има малко по-различен протокол за извършване на заявката. Ruby документът тук 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,

В противен случай този ред ще изведе грешка с недефиниран 'резултат':

upload = result.resumable_upload
person user2989892    schedule 14.11.2013