【问题标题】:Access Google BigQuery Data from local Jupyter Notebooks从本地 Jupyter Notebooks 访问 Google BigQuery 数据
【发布时间】:2016-09-14 01:03:46
【问题描述】:

我在 DataLab 上安装了一些笔记本电脑。 出于多种原因,我想从我机器上的本地 Jupyter 笔记本访问相同的数据。

This question 提出了一些目前我无法使用的方法。

特别是 Gcloud 库:

from gcloud import bigquery
client = bigquery.Client()

给我一​​个堆栈跟踪,其中的最后一行:

ContextualVersionConflict: (protobuf 2.6.1 (/usr/local/lib/python2.7/dist-packages), Requirement.parse('protobuf!=3.0.0.b2.post1,>=3.0.0b2'), set(['gcloud']))

Pandas 库看起来很有希望:

df=pd.io.gbq.read_gbq('SELECT CCS_Category_ICD9, Gender, Admit_Month FROM [xxxxxxxx-xxxxx:xxxx_100MB_newform.xxxxxx_100MB_newform]ORDER by CCS_Category_ICD9',
                 project_id='xxxxxxxx-xxxxx')

还给了我一个堆栈跟踪:

IOError: [Errno 2] No such file or directory: '/usr/local/lib/python2.7/dist-packages/httplib2-0.9.1.dist-info/METADATA'

也许我在 Pandas 方法上有一个身份验证问题,尽管我的浏览器目前已对项目进行身份验证?还是我缺少依赖项?

任何建议或指导表示赞赏..

从本地 Jupyter 笔记本中访问 BigQuery 数据源的最佳方式是什么?

【问题讨论】:

    标签: pandas google-bigquery google-cloud-platform google-cloud-datalab


    【解决方案1】:

    根据来自 gbq.read() 的错误,似乎 httplib2 可能没有正确安装。在 pandas installation page 上,有一些可选的依赖项是 Google BigQuery 支持所必需的(httplib2 就是其中之一)。 要重新安装/修复安装尝试:

    pip install httplib2 --ignore-installed
    

    安装 Google BigQuery 支持的可选依赖项后,以下代码应该可以工作:

    from pandas.io import gbq
    df = gbq.read_gbq('SELECT * FROM MyDataset.MyTable', project_id='my-project-id')
    

    【讨论】:

    • 该死,我希望是这样,Pip 说它是 intslled,我也尝试了 pip --upgrade,同样的结果,已经满意.. :-(
    • --ignore-installed 选项有帮助吗?
    • 但是!!删除我在表名前面的项目 ID 字符串让事情顺利进行,所以简而言之,我在 Select 子句上的格式非常糟糕!
    • 如果您还想在 SQL 字符串中提供项目 ID,请尝试 SELECT * FROM [project-id:MyDataset.MyTable]
    • @AnthoniosPartheniou:我收到错误“响应太大而无法返回”。 read_gbq 中是否有设置来克服此错误。谢谢。
    【解决方案2】:

    如果您使用 Datalab 特定的方式访问 GCP,那么您可能想尝试改用 https://github.com/googledatalab/datalab。这将为您在 Jupyter Notebook 中提供与 Datalab 兼容的功能。

    【讨论】:

    • 一个简单的docker run -it -p "127.0.0.1:8081:8080" -v $PWD:"/content" gcr.io/cloud-datalab/datalab:local 将设置环境而无需构建。
    【解决方案3】:

    我有同样的问题,但通过安装 gbq 的 conda 版本设法解决了它,我已经安装了 python 的 anaconda 发行版,所以我想如果你使用 pip 可能会丢失一些链接

    conda install pandas-gbq --channel conda-forge 这条命令成功了

    【讨论】:

      【解决方案4】:

      我这里有一个例子:https://github.com/kanjih-ciandt/docker-jupyter-gcloud/blob/master/ka.ipynb

      但是,基本上你首先需要安装一些包:

      !pip install google-cloud --user
      !pip install --upgrade google-cloud-bigquery[pandas] --user
      !pip install google-cloud-storage --user
      

      如果您已经有一个服务帐户文件,只需执行此操作(替换 JSON_SERVICE_ACCOUNT_FILE):

      import logging
      import json
      import os
      from datetime import datetime
      import pprint
      
      from googleapiclient import discovery
      from oauth2client.service_account import ServiceAccountCredentials
      
      # Default scope to get access token
      _SCOPE = 'https://www.googleapis.com/auth/cloud-platform'
      from google.cloud import bigquery
      
      client = bigquery.Client.from_service_account_json(JSON_SERVICE_ACCOUNT_FILE)
      # Perform a query.
      QUERY = (
          'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
          'WHERE state = "TX" '
          'LIMIT 100')
      query_job = client.query(QUERY)  # API request
      rows = query_job.result()  # Waits for query to finish
      
      for row in rows:
          print(row.name)
      

      但是,如果您可以访问某个 GCP 项目,但不知道如何创建服务帐户,您可以直接在 jupyter notebook 中创建它:

      SERVICE_ACCOUNT='jupytersa'
      JSON_SERVICE_ACCOUNT_FILE = 'sa1.json'
      GCP_PROJECT_ID='<GCP_PROJECT_ID>' 
      
      import subprocess
      import sys
      import logging
      
      logger = logging.Logger('catch_all')
      
      
      def run_command(parameters):
      
          try:
              return subprocess.check_output(parameters)
          except BaseException as e: 
             logger.error(e) 
             logger.error('ERROR: Looking in jupyter console for more information')
      
      run_command([
              'gcloud', 'iam', 'service-accounts',
              'create', SERVICE_ACCOUNT,
              '--display-name', "Service Account for BETA SCC API",
              '--project', GCP_PROJECT_ID
      ])
      
      
      IAM_ROLES = [
          'roles/editor'
      ]
      
      for role in IAM_ROLES:
          run_command([
              'gcloud', 'projects', 'add-iam-policy-binding',GCP_PROJECT_ID,
              '--member', 'serviceAccount:{}@{}.iam.gserviceaccount.com'.format(SERVICE_ACCOUNT, GCP_PROJECT_ID),
              '--quiet',  '--role', role
          ])
      
      
      run_command([
              'gcloud', 'iam', 'service-accounts',
              'keys', 'create', JSON_SERVICE_ACCOUNT_FILE ,
              '--iam-account', 
              '{}@{}.iam.gserviceaccount.com'.format(SERVICE_ACCOUNT, GCP_PROJECT_ID)
      ])
      

      您可以在此处找到完整示例:https://github.com/kanjih-ciandt/docker-jupyter-gcloud/blob/master/ka.ipynb

      总结一下,如果你想从 Docker 执行这个 notebook,你可以使用这个镜像:https://cloud.docker.com/u/hkanjih/repository/docker/hkanjih/docker-jupyter-gcloud

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 2018-03-31
        相关资源
        最近更新 更多