1

SELECT からフェッチしたデータを別の既存のテーブルに追加しようとしていますが、次のエラーが発生し続けます。

指定されたスキーマがテーブル projectId : datasetIdと一致しませ既存のテーブル

ここに私のリクエスト本文があります:

{'projectId': projectId,
 'configuration': {
     'query': {
         'query': query,
         'destinationTable': {
             'projectId': projectId,
                 'datasetId': datasetId,
                 'tableId': tableId
         },
         'writeDisposition': "WRITE_APPEND"
     }
  }
}

writeDispositionオプションが評価されないようです。

4

3 に答える 3

1

bqコマンドラインツールを使用して、CSVファイルから既存のテーブルにデータを正常に追加しました。私がここで見る唯一の違いは、持つべき構成です

元の質問に示されているように、 writeDispositionの代わりにwrite_disposition。

私がしたことは、ロードのためにbqコマンドラインユーティリティ(pythonスクリプト)に追加フラグを追加することであり、それは魅力のように機能しました。

bq.pyを次のように更新する必要があります。

  1. ロード関数に--appendという新しいフラグを追加しました
  2. RunWithArgsの下の_Loadクラスで、追加が設定されているかどうかを確認します。設定されている場合は、'write_disposition'='WRITE_APPEND'を設定します。

bq.pyのコードは次のように変更されます

クラスの__init__関数に_Load次を追加します

**flags.DEFINE_boolean(
        'append', False,
        'If true then data is appended to the existing table',
        flag_values=fv)**

そして、次のステートメントの後のクラスの関数RunWithArgs_Load

if self.replace:
      opts['write_disposition'] = 'WRITE_TRUNCATE'

--->次のテキストを追加します

**if self.append:
      opts['write_disposition'] = 'WRITE_APPEND'**

コマンドラインで

> bq.py --append=true <mydataset>.<existingtable> <filename>.gz

圧縮された(gzip圧縮された)csvファイルの内容を既存のテーブルに追加します。

于 2012-06-04T23:17:31.553 に答える
1

わかりました、ここで何かを得たと思います。それは奇妙なものです...実際には、まったく同じスキーマ(フィールドモード)を持っていると機能しません。

ソース テーブルのスキーマは次のとおりです。

 "schema": {
   "fields": [
   {
     "name": "ID_CLIENT",
     "type": "INTEGER",
     "mode": "NULLABLE"
   },
   {
     "name": "IDENTITE",
     "type": "STRING",
     "mode": "NULLABLE"
   }
  ]
  }

ブラウザー インターフェース (bigquery.cloud.google.com) からコピー機能を使用すると、期待されるものとまったく同じスキーマが得られます。

"schema": {
  "fields": [
  {
    "name": "ID_CLIENT",
    "type": "INTEGER",
    "mode": "NULLABLE"
  },
  {
    "name": "IDENTITE",
    "type": "STRING",
    "mode": "NULLABLE"
  }
  ]
 }

しかし、次のフェッチからコピーされたテーブルに追加できません。

SELECT ID_CLIENT + 1 AS ID_CLIENT, RIGHT(IDENTITE,12) AS IDENTITE FROM datasetid.client

少なくともブラウザー インターフェイス ビューからは同じスキーマを返しますが、内部的には次のスキーマを返します。

"schema": {
 "fields": [
 {
   "name": "ID_CLIENT",
   "type": "INTEGER",
   "mode": "REQUIRED"
 },
 {
   "name": "IDENTITE",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

}

正確には同じスキーマではありません (チェックモード)。

そして奇妙なことに、この選択:

SELECT ID_CLIENT, IDENTITE FROM datasetid.client

このスキーマを返します:

"schema": {
  "fields": [
  {
    "name": "ID_CLIENT",
    "type": "INTEGER",
    "mode": "REQUIRED"
  },
  {
    "name": "IDENTITE",
    "type": "STRING",
    "mode": "REQUIRED"
  }
 ]
}

結論:

Don't rely on tables schema information from the browser interface, always use Tables.get API. Copy doesn't really work as expected...

于 2012-05-11T08:40:11.863 に答える
1

追加が機能するためには、既存のテーブルのスキーマが、追加するクエリ結果のスキーマと正確に一致する必要があります。これが事実であることを確認できますか (これを確認する 1 つの方法は、このクエリをテーブルとして保存し、スキーマを追加先のテーブルと比較することです)。

于 2012-05-10T16:06:20.493 に答える