2016-04-25 10 views
3

BigQuery Python APIを使用して分析を実行しています。ストリーミング前のBigQueryテーブルの切り捨て

def stream_data(self, table, data, schema, how=None): 
    r = self.connector.tables().list(projectId=self._project_id, 
            datasetId='lbanor').execute() 
    table_exists = [row['tableReference']['tableId'] for row in 
        r['tables'] if 
        row['tableReference']['tableId'] == table] 
    if table_exists: 
     if how == 'WRITE_TRUNCATE': 
      self.connector.tables().delete(projectId=self._project_id, 
              datasetId='lbanor', 
              tableId=table).execute() 
      body = { 
       'tableReference': { 
        'tableId': table, 
        'projectId': self._project_id, 
        'datasetId': 'lbanor' 
       }, 
       'schema': schema 
      } 
      self.connector.tables().insert(projectId=(
              self._project_id), 
              datasetId='lbanor', 
              body=body).execute() 
    else: 
     body = { 
      'tableReference': { 
       'tableId': table, 
       'projectId': self._project_id, 
       'datasetId': 'lbanor' 
      }, 
      'schema': schema 
     } 
     self.connector.tables().insert(projectId=(
             self._project_id), 
             datasetId='lbanor', 
             body=body).execute() 

    body = { 
     'rows': [ 
      { 
       'json': data, 
       'insertId': str(uuid.uuid4()) 
      } 
     ] 
    } 
    self.connector.tabledata().insertAll(projectId=(
             self._project_id), 
             datasetId='lbanor', 
             tableId=table, 
               body=body).execute(num_retries=5) 

connectorだけでビルドオブジェクトです:そうするために、我々は以下のアダプタを作成しました。

主な目的は、データを指定のテーブルにストリームすることです。そして、テーブルがすでに存在し、 "どのように"入力が "WRITE_TRUNCATE"として渡された場合、テーブルは最初に削除され、再び作成されます。 その後、データストリームを実行します。

テーブルが何度も何度も削除されなければ、すべてうまく動作しました。例えば

我々は、書き込み切り捨てオプション(forループがhow=Nonestream_dataを呼び出し続ける)をシミュレートせずにスクリプトを実行すると、これが結果です:

[ 
    { 
    "date": "2016-04-25", 
    "unix_date": "1461606664981207", 
    "init_cv_date": "2016-03-12", 
    "end_cv_date": "2016-03-25", 
    "days_trained": "56", 
    "days_validated": "14", 
    "navigated_score": "1", 
    "carted_score": "3", 
    "purchased_score": "10", 
    "description": "First trial of top seller alg. No filter nor any condition is applied. Skus not present in train count as rank=0.5", 
    "metric": "rank", 
    "result": "0.31729249914663893" 
    }, 
    { 
    "date": "2016-04-25", 
    "unix_date": "1461606599745107", 
    "init_cv_date": "2016-03-06", 
    "end_cv_date": "2016-03-25", 
    "days_trained": "80", 
    "days_validated": "20", 
    "navigated_score": "1", 
    "carted_score": "3", 
    "purchased_score": "10", 
    "description": "First trial of top seller alg. No filter nor any condition is applied. Skus not present in train count as rank=0.5", 
    "metric": "rank", 
    "result": "0.32677143128667446" 
    }, 
    { 
    "date": "2016-04-25", 
    "unix_date": "1461606688950415", 
    "init_cv_date": "2016-03-14", 
    "end_cv_date": "2016-03-25", 
    "days_trained": "48", 
    "days_validated": "12", 
    "navigated_score": "1", 
    "carted_score": "3", 
    "purchased_score": "10", 
    "description": "First trial of top seller alg. No filter nor any condition is applied. Skus not present in train count as rank=0.5", 
    "metric": "rank", 
    "result": "0.3129267723358932" 
    }, 
    { 
    "date": "2016-04-25", 
    "unix_date": "1461606707195122", 
    "init_cv_date": "2016-03-16", 
    "end_cv_date": "2016-03-25", 
    "days_trained": "40", 
    "days_validated": "10", 
    "navigated_score": "1", 
    "carted_score": "3", 
    "purchased_score": "10", 
    "description": "First trial of top seller alg. No filter nor any condition is applied. Skus not present in train count as rank=0.5", 
    "metric": "rank", 
    "result": "0.310620987663015" 
    }, 
    { 
    "date": "2016-04-25", 
    "unix_date": "1461606622432947", 
    "init_cv_date": "2016-03-08", 
    "end_cv_date": "2016-03-25", 
    "days_trained": "72", 
    "days_validated": "18", 
    "navigated_score": "1", 
    "carted_score": "3", 
    "purchased_score": "10", 
    "description": "First trial of top seller alg. No filter nor any condition is applied. Skus not present in train count as rank=0.5", 
    "metric": "rank", 
    "result": "0.32395802949369296" 
    } 
] 

をしかし、我々は、入力と同じアダプタを使用する場合how = "WRITE_TRUNCATE"、その動作が変わり、予測できなくなった。

時々動作し、データがテーブルに保存されます。しかし、エラーが発生していない場合でも、データはテーブルに保存されません。

テーブルを照会しようとすると、データは返されません。それは単に「クエリがゼロの結果を返す」を返します。

テーブルを削除して再度作成し、データをストリーミングするときに何か問題が発生しました。間違いはありますか?

詳細が必要な場合はお知らせください。前もって感謝します!

答えて

3

https://stackoverflow.com/a/36417177/132438(ともにBigQueryのエンジニア)に対するJordan Tiganiの答えとSean Chenのコメントを参照してください。

概要は次のとおりです。

  • 場合は再作成または切捨て表「あなたが削除されているデータを避けるためにストリーミングする前に> 2分間待つ必要があります

だからだろう。

+0

ありがとう、ホフア!私はスクリプトを順応させます。 –

関連する問題