43765


bigquery-pythonを使って、ツイッターのデータをビッグクエリにインポートしようとしているのですができません。  
どうやら、create_tableができていないみたいです。問題の部分だけ抽出すると以下のコードです。

[code]

    import bigquery
    
    # 認証情報はcredentials.jsonから取得。
    # グーグルクラウドプラットフォームでサービスアカウントを作成して、「新しい秘密鍵の提供」から取得。
    client = bigquery.get_client(json_key_file='credentials.json', readonly=False)
    
    client.create_dataset(dataset_id='tiwtter')  # Falseが返ってくる。datasetは作成されていない。
    
[/code]

環境：  
OS :Ubuntu 14.04.5 LTS  
python:3.6.4  
conda :4.3.34  
bigquery:1.14.0

念の為以下にコードの全文を記載します。

[code]

    import os
    import sys
    from datetime import timezone
    
    import tweepy
    import bigquery
    import pandas as pd
    
    # Twitterの認証情報を読み込む。
    twitter_api = pd.read_csv('api_twitter.csv', names=['name', 'value'], header=None)
    twitter_api
    CONSUMER_KEY = twitter_api.loc[0, 'value']
    CONSUMER_SECRET = twitter_api.loc[1, 'value']
    ACCESS_TOKEN = twitter_api.loc[2, 'value']
    ACCESS_TOKEN_SECRET = twitter_api.loc[3, 'value']
    
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    
    # BigQueryの認証情報(credentials.json)を指定してBigQueryのクライアントを作成する。
    # 明示的にreadonly=Falseとしないと書き込みができない。
    client = bigquery.get_client(json_key_file='credentials.json', readonly=False)
    
    DATASET_NAME = 'twitter'  # BigQueryのデータ・セット名
    TABLE_NAME = 'tweets'  # BigQueryのテーブル名
    
    # テーブルが存在しない場合は作成する。
    if not client.check_table(DATASET_NAME, TABLE_NAME):
            print('Creating table {0}.{1}'.format(DATASET_NAME, TABLE_NAME), file=sys.stderr)
            # create_table()の第三引数にはスキーマを指定する。
            client.create_table(DATASET_NAME, TABLE_NAME, [
                {'name': 'id',          'type': 'string',    'description': 'ツイートのID'},
                {'name': 'lang',        'type': 'string',    'description': 'ツイートの言語'},
                {'name': 'screen_name', 'type': 'string',    'description': 'ユーザー名'},
                {'name': 'text',        'type': 'string',    'description': 'ツイートの本文'},
                {'name': 'created_at',  'type': 'timestamp', 'description': 'ツイートの日時'},
            ])
    
    
    class MyStreamListener(tweepy.streaming.StreamListener):
        """
        Streaming APIで取得したツイートを処理するクラス
        """
    
        status_list = []
        num_imported = 0
    
        def on_status(self, status):
            """
            ツイートを受信した時に呼び出されるメソッド。
            引数: ツイートを表すStatusオブジェクト
            """
            self.status_list.append(status)  # Statusオブジェクトをstatus_listに追加する。
    
            if len(self.status_list) >= 500:
                # status_listに500件溜まったらBigQueryにインポートする。
                if not push_to_bigquery(self.status_list):
                    #  インポートに失敗した場合はFalseが帰ってくるのでエラーを出して終了する。
                    print('Failed to send to bigquery', file=sys.stderr)
                    return False
    
                # num_importedを増やして、status_listを空にする。
                self.num_imported += len(self.status_list)
                self.status_list = []
                print('Imported {0} rows'.format(self.num_imported), file=sys.stderr)
    
                # 料金が高額にならないように、5000件をインポートしたらFalseを返して終了する。
                # 継続的にインポートしたいときは次の2行をコメントアウトしてください。
                if self.num_imported >= 5000:
                    return False
    
    
    def push_to_bigquery(status_list):
        """
        ツイートのリストをBigQueryにインポートする。
        """
    
        # TweepyのStatusオブジェクトのリストからdictのリストに変換する。
        rows = []
        for status in status_list:
            rows.append({
                'id': status.id_str,
                'lang': status.lang,
                'screen_name': status.author.screen_name,
                'text': status.text,
                # datetimeオブジェクトをUTCのPOSIXタイムスタンプに変換する。
                'created_at': status.created_at.replace(tzinfo=timezone.utc).timestamp()
            })
    
        # dictのリストをBigQueryにインポートする。
        # 引数は順に、データ・セット名、テーブル名、行のリスト、行を一意に識別する列名を表す。
        # insert_id_keyはエラーでリトライした時に重複しないようにするために使われるが、必須ではない。
        return client.push_rows(DATASET_NAME, TABLE_NAME, rows, insert_id_key='id')
    
    
        # Stream APIの読み込みを開始する。
        print('Collecting tweets...', file=sys.stderr)
        stream = tweepy.Stream(auth, MyStreamListener())
        # 公開されているツイートをサンプリングしたストリームを受信する。
        # 言語を指定していないので、あるゆる言語のツイートを取得できる。
        stream.sample()
    
[/code]


CC BY-SA 4.0
2018-05-03T04:51:16.487
43754
2018-05-03T15:35:14.593
28240
question
python twitter google-bigquery
bigquery-pythonでcreate_dataset, create_tableが動かない


BigQueryの操作に必要な役割が付与されていない可能性が高いです。

[公式マニュアル](https://cloud.google.com/bigquery/docs/reference/libraries?hl=ja)のとおり、クライアント
ライブラリのインストールと環境変数の設定をして、

[code]

    pip install --upgrade google-cloud-bigquery
    export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
    
[/code]

例を実行してみてください。

[code]

    from google.cloud import bigquery
    
    bigquery_client = bigquery.Client()
    dataset_id = 'my_new_dataset'
    dataset_ref = bigquery_client.dataset(dataset_id)
    dataset = bigquery.Dataset(dataset_ref)
    
    dataset = bigquery_client.create_dataset(dataset)
    print('Dataset {} created.'.format(dataset.dataset_id))
    
[/code]

公式のライブラリーだとエラーメッセージが出るので原因がわかります。

bigquery-pythonは、一見便利そうだけど、Falseしか返ってこないのは問題ですね。


CC BY-SA 4.0
2018-05-03T15:28:11.290
43765
2018-05-03T15:35:14.593
2018-05-03T15:35:14.593
15171
15171
43754
answer