7

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

这个问题提出了一些到目前为止我无法工作的方法。

特别是 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 数据源的最佳方式是什么?

4

4 回答 4

8

根据来自 的错误gbq.read(),似乎 httplib2 可能没有正确安装。在 pandas安装页面上,有一些可选的依赖项是 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')
于 2016-05-17T22:20:55.147 回答
1

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

于 2016-05-18T23:03:39.443 回答
0

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

conda install pandas-gbq --channel conda-forge 这个命令做了生意

于 2018-01-31T10:04:27.377 回答
0

我这里有一个例子: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

于 2019-01-14T18:05:20.083 回答