Bigquery PHP create table schema or create table f

2019-03-30 17:39发布

问题:

I want to create a BigQuery table from a Query result or create table with schema in PHP. I'm processing right now these sentences but they are making an empty-noschema table:

$postBody = array(  'tableReference' =>
    array(
        'projectId' => $project_id,
        'datasetId' => $dataset,
        'tableId' => 'josetest'
    )
);

$table = $service->tables->insert($project_id, $dataset, new Google_Service_Bigquery_Table($postBody));

I found probably the python solution but could anyone translate it to PHP? It is:

"configuration": {
  "query": {
    "query": "select count(*) from foo.bar",
    "destinationTable": {
      "projectId": "my_project",
      "datasetId": "my_dataset",
      "tableId": "my_table"
    },
    "createDisposition": "CREATE_IF_NEEDED",
    "writeDisposition": "WRITE_APPEND",
  }
}

回答1:

  1. easiest is to use Google APIs Client Library for PHP

  2. see this post how to instantiate Google_Client object and authenticate

  3. a section from a couple of classes from our own code.

.

/**
 * @param Google_Client $client 
 * @param string $project_id
 * @param string $dataset_id
 * @throws Google_Service_Exception
 * @return Google_Service_Bigquery_Table
 */
public function BQ_Tables_Insert($client, $project_id, $dataset_id) {
    $bq = new Google_Service_Bigquery($client);
    $table_reference = new Google_Service_Bigquery_TableReference();
    $table_reference->setProjectId($project_id);
    $table_reference->setDatasetId($dataset_id);
    $table_reference->setTableId(static::tableId());
    $schema = new Google_Service_Bigquery_TableSchema();
    $schema->setFields(static::fields());
    $table = new Google_Service_Bigquery_Table();
    $table->setTableReference($table_reference);
    $table->setSchema($schema);

    try {
        return $bq->tables->insert($project_id, $dataset_id, $table);
    } catch (Google_Service_Exception $e) {
        $this->setErrors($e->getErrors())->setErrorMessage($e->getMessage());
        throw $e;
    }
}

where static::tableId() is the name of the table, and static::fields() is the array representation of the table

/**
 * @see https://developers.google.com/bigquery/docs/reference/v2/tables/insert
 */
public static function fields() {
    return array(
        array('name' => 'user_id', 'type' => 'integer', 'mode' => 'required'),
        array('name' => 'order_id', 'type' => 'integer', 'mode' => 'required'),
        array('name' => 'status', 'type' => 'integer', 'mode' => 'nullable'),
        array('name' => 'timestamp', 'type' => 'timestamp', 'mode' => 'nullable')
    );
}


回答2:

Thank you so much, previous answer solve mi problem.

 $fields = array(
        array('name' => 'user_id', 'type' => 'integer', 'mode' => 'required'),
        array('name' => 'order_id', 'type' => 'integer', 'mode' => 'required'),
        array('name' => 'status', 'type' => 'integer', 'mode' => 'nullable'),
        array('name' => 'timestamp', 'type' => 'timestamp', 'mode' => 'nullable')
    );


    //$bq = $service
    $table_reference = new Google_Service_Bigquery_TableReference();
    $table_reference->setProjectId($project_id);
    $table_reference->setDatasetId($dataset);
    $table_reference->setTableId("testsales");
    $schema = new Google_Service_Bigquery_TableSchema();
    $schema->setFields($fields);
    $table = new Google_Service_Bigquery_Table();
    $table->setTableReference($table_reference);
    $table->setSchema($schema);

    try {
        return $service->tables->insert($project_id, $dataset, $table);
    } catch (Google_Service_Exception $e) {
        $this->setErrors($e->getErrors())->setErrorMessage($e->getMessage());
        throw $e;
    }

This created a Bigquery table with schema. Bye!