使用带有模式的PHPAPI在BigQuery中创建表

使用带有模式的PHPAPI在BigQuery中创建表,php,google-bigquery,Php,Google Bigquery,我正在尝试使用PHPAPI在bigquery中创建一个表 我可以创建一个没有模式的表,但是当我提供一个模式时,会出现错误。看起来我使用了错误的语法,但是我尝试了我能想到的任何格式,却找不到一个我试图实现的示例 我使用字符串文字作为fields参数进行测试。我的代码如下所示: $bigQuery = new BigQueryClient([ 'keyFilePath' => [keyfilepath], 'projectId' => [proje

我正在尝试使用PHPAPI在bigquery中创建一个表

我可以创建一个没有模式的表,但是当我提供一个模式时,会出现错误。看起来我使用了错误的语法,但是我尝试了我能想到的任何格式,却找不到一个我试图实现的示例

我使用字符串文字作为fields参数进行测试。我的代码如下所示:

    $bigQuery = new BigQueryClient([
        'keyFilePath' => [keyfilepath],
        'projectId' => [projectid],
        'location' => [location]
    ]);

    /** @var Dataset $dataSet */
    $dataSet = $bigQuery->dataset('my-data-set');

    $fieldString = '{"name": "myfield","type": "STRING","mode": "REQUIRED"}' . "\n" . '{"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}';
    $options = [
        'fields' => $fieldString
    ];
    $dataSet->createTable('mytable', $options);
$fieldString = '[{"name": "myfield","type": "STRING","mode": "REQUIRED"}, {"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}]';
    $fields = [
        ['name'=> 'myfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED'],
        ['name'=> 'anotherfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED']
    ];
    $options = [
        'fields' => $fields
    ];
    $dataSet->createTable('mytable', $options);
 $fields = [
    [
        'name' => 'field1',
        'type' => 'string',
        'mode' => 'required'
    ],
    [
        'name' => 'field2',
        'type' => 'integer'
    ],
];
这就产生了错误:

无效的字段选择{\'name\:\'myfield\'

或者,当我格式化“$fieldString”时,如下所示:

    $bigQuery = new BigQueryClient([
        'keyFilePath' => [keyfilepath],
        'projectId' => [projectid],
        'location' => [location]
    ]);

    /** @var Dataset $dataSet */
    $dataSet = $bigQuery->dataset('my-data-set');

    $fieldString = '{"name": "myfield","type": "STRING","mode": "REQUIRED"}' . "\n" . '{"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}';
    $options = [
        'fields' => $fieldString
    ];
    $dataSet->createTable('mytable', $options);
$fieldString = '[{"name": "myfield","type": "STRING","mode": "REQUIRED"}, {"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}]';
    $fields = [
        ['name'=> 'myfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED'],
        ['name'=> 'anotherfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED']
    ];
    $options = [
        'fields' => $fields
    ];
    $dataSet->createTable('mytable', $options);
 $fields = [
    [
        'name' => 'field1',
        'type' => 'string',
        'mode' => 'required'
    ],
    [
        'name' => 'field2',
        'type' => 'integer'
    ],
];
我得到一个错误:

无效的字段掩码“[{name\”:“myfield\”,“type\”:“STRING\”,“mode\”:“REQUIRED\”,{\“name\”:“anotherfield\”,“type\”:“STRING\”,“mode\”:“REQUIRED\”)。映射键应表示为[\“some\ u key\”]

我还尝试先创建表,然后像这样更新它:

$table = $dataSet->createTable('mytable');
$table->update($options);
但是我得到了同样的错误,即使我使用json表示法,问题仍然存在

我做错了什么

更新:

实际上,在我切换到字段的字符串文字之前,我首先尝试了这一点:

    $fields = [
        ['name'=> 'myfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED'],
        ['name'=> 'anotherfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED']
    ];
    $options = [
        'schema' => $fields
    ];
    $dataSet->createTable('mytable', $options);
这将产生以下错误:

接收到无效的JSON负载。“表”中的未知名称“架构”:Proto字段未重复,无法启动列表

然后我将代码编辑成如下所示:

    $bigQuery = new BigQueryClient([
        'keyFilePath' => [keyfilepath],
        'projectId' => [projectid],
        'location' => [location]
    ]);

    /** @var Dataset $dataSet */
    $dataSet = $bigQuery->dataset('my-data-set');

    $fieldString = '{"name": "myfield","type": "STRING","mode": "REQUIRED"}' . "\n" . '{"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}';
    $options = [
        'fields' => $fieldString
    ];
    $dataSet->createTable('mytable', $options);
$fieldString = '[{"name": "myfield","type": "STRING","mode": "REQUIRED"}, {"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}]';
    $fields = [
        ['name'=> 'myfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED'],
        ['name'=> 'anotherfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED']
    ];
    $options = [
        'fields' => $fields
    ];
    $dataSet->createTable('mytable', $options);
 $fields = [
    [
        'name' => 'field1',
        'type' => 'string',
        'mode' => 'required'
    ],
    [
        'name' => 'field2',
        'type' => 'integer'
    ],
];
其中:

警告:rawurlencode()要求参数1为字符串,数组给定


我以前在问题中没有提到这一点,因为我认为它不相关。事后看来可能是这样,但我的问题仍然存在。没有
$fieldString
这类东西,即
$fields
数组

像这样:

    $bigQuery = new BigQueryClient([
        'keyFilePath' => [keyfilepath],
        'projectId' => [projectid],
        'location' => [location]
    ]);

    /** @var Dataset $dataSet */
    $dataSet = $bigQuery->dataset('my-data-set');

    $fieldString = '{"name": "myfield","type": "STRING","mode": "REQUIRED"}' . "\n" . '{"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}';
    $options = [
        'fields' => $fieldString
    ];
    $dataSet->createTable('mytable', $options);
$fieldString = '[{"name": "myfield","type": "STRING","mode": "REQUIRED"}, {"name": "anotherfield", "type": "STRING", "mode": "REQUIRED"}]';
    $fields = [
        ['name'=> 'myfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED'],
        ['name'=> 'anotherfield', 'type' => 'INTEGER', 'mode' => 'REQUIRED']
    ];
    $options = [
        'fields' => $fields
    ];
    $dataSet->createTable('mytable', $options);
 $fields = [
    [
        'name' => 'field1',
        'type' => 'string',
        'mode' => 'required'
    ],
    [
        'name' => 'field2',
        'type' => 'integer'
    ],
];
然后


参见示例。

谢谢你的回答。这实际上是我尝试的第一件事,但我收到的错误似乎很明显,我没有提及。我已经用添加的示例更新了我的问题,你介意看一下吗?再次检查模式->字段->你的数组符号。你没有设置“模式”键的行。就是这样。Tha这个问题很好地说明了为什么异常应该有有用的消息。它开始于我在“table”中阅读“Unknown name\”schema\“并认为“这个键显然有错误的名称”。