2014-02-15 3 views
5

Alles scheint mir funktioniert, außer für die letzte Zeile dieser Funktion. Aber es scheint, dass der JSON (Zeilen) das Problem ist ...BigQuery [PHP] InsertAll Fehler: Keine Datensätze in Tabelle Daten anhängen Anfrage

Jede Hilfe wird geschätzt!

Fehler:

Google_Service_Exception 
Error calling POST https://www.googleapis.com/bigquery/v2/projects/mtg/datasets/log/tables/v1/insertAll: (400) No records present in table data append request. 

Tabellenschema:

raw_url   STRING  NULLABLE 
endpoint  STRING  NULLABLE 
parameter  STRING  NULLABLE 
client_ip  STRING  NULLABLE 
account   INTEGER  NULLABLE 
response_code INTEGER  NULLABLE 
response_time INTEGER  NULLABLE 
datetime  TIMESTAMP NULLABLE 

Code:

public function insertLog() 
{ 
    $rows = new Google_Service_Bigquery_TableDataInsertAllRequestRows; 
    $rows->setJson('{"raw_url":"test","endpoint":"card.id","parameter":"1","client_ip":"127.0.0.1","account":1,"response_code":200,"response_time":1000,"created_at":"2014-02-14 19:16:21"}'); 
    $rows->setInsertId("21"); 

    $request = new Google_Service_Bigquery_TableDataInsertAllRequest; 
    $request->setKind('bigquery#tableDataInsertAllRequest'); 
    $request->setRows($rows); 

    $this->service->tabledata->insertAll($this->project_id, 'log', 'v1', $request); 
} 

Antwort

4

Die Klasse Google_Service_Bigquery_TableDataInsertAllRequestRows _Row nicht _Rows genannt werden sollte, weil Sie eine Reihe von _Rows machen müssen Objekte, um die Anfrage zu übergeben. Hier ist der Code, der endlich funktioniert hat.

Außerdem muss der JSON ein Objekt sein, keine JSON-Zeichenfolge. $ data = der json_decode der JSON-Zeichenfolge, die in der ursprünglichen Frage enthalten war.

public function insertLog($data) 
{ 
    $rows = array(); 
    $row = new Google_Service_Bigquery_TableDataInsertAllRequestRows; 
    $row->setJson($data); 
    $row->setInsertId(strtotime('now')); 
    $rows[0] = $row; 

    $request = new Google_Service_Bigquery_TableDataInsertAllRequest; 
    $request->setKind('bigquery#tableDataInsertAllRequest'); 
    $request->setRows($rows); 

    $this->service->tabledata->insertAll($this->project_id, 'log', 'v1', $request); 
} 
+0

Vielen Dank! Gespeichert viel Zeit! Ich habe ein Beispiel Repo bei https://github.com/eRadical/google-api-php-client-examples würden Sie gerne diesen Code beitragen? Ich kann es schreiben ... oder Sie können, wenn Sie Zeit haben wollen. Natürlich mit korrekter Zuordnung. – eRadical

1

Ich wollte nur teilen: ich eine kleine Änderung vornehmen, da der Code oben nicht für mich gearbeitet hat: Diese Linie ist ein Problem aufgetreten

$this->service->tabledata->insertAll($this->project_id, 'log', 'v1', $request); 

Das Problem das Schlüsselwort $ diese verwendet -> Service. Das liegt daran, dass der Code nicht innerhalb einer Klasse ausgeführt wurde. Statt dessen $, sollten Sie die $ Dienst nutzen

dies ist der vollständige Code von PHP Google BigQuery Auth und php Google BigQuery Insert, das funktioniert für mich:

define("CLIENT_ID", 'my client id'); 
    define('KEY_FILE','key.p12'); 
    define('SERVICE_ACCOUNT_NAME', 'its the email address as appear on the credential page'); 
    define('PROJECT_ID', 'my project'); 
    define('DATASET_ID', 'my data set'); 
    define('TABLE_ID', 'my table'); 

    $client_id = CLIENT_ID; 
    $service_account_name = SERVICE_ACCOUNT_NAME; //Email Address 
    $key_file_location = KEY_FILE; 

    // Cashing the client inside a session. 
    $client = new Google_Client(); 
    $client->setApplicationName("Client_Library_Examples"); 

    if (isset($_SESSION['service_token'])) 
    { 
     $client->setAccessToken($_SESSION['service_token']); 
    } 
    else 
    { 
     $key = file_get_contents($key_file_location); 
     $cred = new Google_Auth_AssertionCredentials(
      $service_account_name, 
      array('https://www.googleapis.com/auth/bigquery'), 
      $key 
     ); 
     $client->setAssertionCredentials($cred); 
     $client->setClientId(CLIENT_ID); 

     if ($client->getAuth()->isAccessTokenExpired()) { 
      $client->getAuth()->refreshTokenWithAssertion($cred); 
     } 
     $_SESSION['service_token'] = $client->getAccessToken(); 
    } 


    $service = new Google_Service_Bigquery($client); 


    $data = array('fields1' => '1', 'sample' => '2','maker' => '2'); 
    try { 
    $rows = array(); 
     $row = new Google_Service_Bigquery_TableDataInsertAllRequestRows; 
     $row->setJson($data); 
     $row->setInsertId(strtotime('now')); 
     $rows[0] = $row; 

     $request = new Google_Service_Bigquery_TableDataInsertAllRequest; 
     $request->setKind('bigquery#tableDataInsertAllRequest'); 
     $request->setRows($rows); 

     $response = $service->tabledata->insertAll(PROJECT_ID, DATASET_ID , TABLE_ID, $request); 
print_r($response); 

} catch (Exception $ex) { 
    echo $ex->getMessage(); 
} } 

Diese Antwort bedeuten, dass es keine Fehler ist . gehen in die BigQuery zu überprüfen und sehen die Werte:

Google_Service_Bigquery_TableDataInsertAllResponse Object 
(
    [collection_key:protected] => insertErrors 
    [internal_gapi_mappings:protected] => Array 
     (
     ) 

    [insertErrorsType:protected] => Google_Service_Bigquery_TableDataInsertAllResponseInsertErrors 
    [insertErrorsDataType:protected] => array 
    [kind] => bigquery#tableDataInsertAllResponse 
    [modelData:protected] => Array 
     (
     ) 

    [processed:protected] => Array 
     (
     ) 

) 

Viel Glück allen!

+0

Das Problem besteht darin, das Schlüsselwort $ this-> service zu verwenden. Das liegt daran, dass der Code nicht innerhalb einer Klasse ausgeführt wurde. Anstelle von $ this, sollten Sie den $ service – Yan

+0

ok verwenden, ich tat es. Vielen Dank. – Yan

Verwandte Themen