Ich versuche, über die BigQuery-API mit Python eine Verbindung zu Google BigQuery herzustellen.
Ich folge dieser Seite hier: https://cloud.google.com/bigquery/bigquery-api-quickstart
Mein Code lautet wie folgt:
import os
import argparse
from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import GoogleCredentials
GOOGLE_APPLICATION_CREDENTIALS = './Peepl-cb1dac99bdc0.json'
def main(project_id):
# Grab the application's default credentials from the environment.
credentials = GoogleCredentials.get_application_default()
print(credentials)
# Construct the service object for interacting with the BigQuery API.
bigquery_service = build('bigquery', 'v2', credentials=credentials)
try:
query_request = bigquery_service.jobs()
query_data = {
'query': (
'SELECT TOP(corpus, 10) as title, '
'COUNT(*) as unique_words '
'FROM [publicdata:samples.shakespeare];')
}
query_response = query_request.query(
projectId=project_id,
body=query_data).execute()
print('Query Results:')
for row in query_response['rows']:
print('\t'.join(field['v'] for field in row['f']))
except HttpError as err:
print('Error: {}'.format(err.content))
raise err
if __== '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('project_id', help='Your Google Cloud Project ID.')
args = parser.parse_args()
main(args.project_id)
Wenn ich diesen Code über das Terminal ausführen, erhalte ich jedoch die folgende Fehlermeldung:
oauth2client.client.ApplicationDefaultCredentialsError: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
Wie Sie im Code sehen können, habe ich versucht, den GOOGLE_APPLICATION_CREDENTIALS
gemäß der Verknüpfung im Fehler festzulegen. Der Fehler bleibt jedoch bestehen. Weiß jemand, worum es geht?
Danke im Voraus.
Es sucht nach der Umgebungsvariablen in Ihrer lokalen UNIX-Umgebung (oder einer anderen), nicht nach einer Variablen in Ihrem Python-Skript.
Sie haben dies festgelegt, indem Sie Ihr Terminal oder cygwin geöffnet haben und eine der folgenden Aktionen ausführen:
export GOOGLE_APPLICATION_CREDENTIALS='/path/to/your/client_secret.json'
Geben Sie das in Ihr Terminal ein, um die Variable nur für diese Sitzung festzulegen
Öffnen Sie Ihre .bashrc-Datei in UNIX, indem Sie nano ~/.bashrc eingeben und fügen Sie diese Zeile unter benutzerspezifischen Aliasnamen hinzu, wenn Sie diesen Header sehen:
GOOGLE_APPLICATION_CREDENTIALS="/full/path/to/your/client_secret.json"
Laden Sie es dann erneut durch Eingabe von source ~/.bashrc und bestätigen Sie die Einstellung, indem Sie echo $GOOGLE_APPLICATION_CREDENTIALS
versuchen. Wenn der Pfad zurückgegeben wird, sind Sie gut.
Erstens - Vielen Dank für den Code - dies war sehr nützlich. Ich würde auch vorschlagen, die Umgebungsvariable direkt in Ihrem Code zu setzen - um sie nicht für jede Umgebung festzulegen, in der Sie arbeiten. Sie können die folgenden Code:
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path_to_your_.json_credential_file"
Ich fand dies nützlich, wenn Sie zwischen verschiedenen Projekten wechseln, für die unterschiedliche Anmeldeinformationen erforderlich sind.
Ich bin nicht sicher über BigQuery
, aber ich verwende Google Data Store
zum Speichern. Wenn Sie gcloud sdk
auf Ihrem Mac installiert haben, können Sie diesen Befehl ausführen
gcloud auth application-default login
Hinweis: oauth2client ist veraltet , anstelle von GoogleCredentials.get_application_default()
können Sie google.auth.default () verwenden. Installieren Sie das Paket zuerst mit:
pip install google-auth
In Ihrem speziellen Beispiel wissen Sie, wo sich die JSON-Datei in Ihrem Code befindet. Anstelle von Standardanmeldeinformationen (von Umgebungsvariablen) können Sie verwenden Sie ein Dienstkonto direkt mit dem Modul google.oauth2.service_account .
credentials = google.oauth2.service_account.from_service_account_file(
'./Peepl-cb1dac99bdc0.json',
scopes=['https://www.googleapis.com/auth/cloud-platform'])
Sie können diese Berechtigungsnachweisdatei genauso verwenden, wie Sie es derzeit tun, indem Sie sie an googleapiclient.discovery.build übergeben. Wenn Sie die Bibliothek google-cloud-bigquery
library verwenden, übergeben Sie die Berechtigungsnachweise an google.cloud.bigquery.Client Konstruktor.
Der in der Fehlermeldung angegebene Link https://developers.google.com/identity/protocols/application-default-credentials gibt an, dass der Umgebungsvariable so eingestellt ist, dass er auf den Fehler verweist enthält die JSON-Service-Berechtigungsnachweise. Es sieht so aus, als würden Sie eine Python-Variable festlegen. Stellen Sie die Umgebungsvariable Ihres Terminals so ein, dass sie auf die richtige Datei zeigt.
Eine Alternative wäre die explizite Verwendung anderer Anmeldeinformationen, wenn Sie nicht in einem GCE-Container ausgeführt werden, wie oauth2client.client.SignedJwtAssertionCredentials
, und direkt auf das Clientgeheimnis verweisen, sodass Sie nicht durch eine Umgebungsvariable indirekt navigieren müssen.
Es sucht nach der Umgebungsvariablen. Ich konnte dieses Problem jedoch auf der Windows-Plattform mithilfe von Anwendungs-Standardanmeldeinformationen lösen.
Schritte, denen ich folgte:
gcloud init
-Schritte aus, um meine Standardanmeldeinformationen und das Standardprojekt anzugeben, die Sie bei Bedarf ändern können. Die gcloud
-Programmdatei kann im Verzeichnis bin
abgelegt werden, in dem Sie Google SDK installiert haben. C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail"
. einchecken. Dort finden Sie die im JSON-Format gespeicherten Anmeldeinformationen.Es hat mir geholfen, den Fehler zu beheben.
GOOGLE_APPLICATION_CREDENTIALS - KEINE FEHLERLÖSUNG FÜR C #
System.Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",@"C:\apikey.json");
string Pathsave = System.Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");
Wenn Sie andere Berechtigungsnachweisdateien verwenden möchten, ohne die Umgebungsvariable festzulegen, können Sie den folgenden Code verwenden:
from oauth2client import service_account
from apiclient.discovery import build
import json
client_credentials = json.load(open("<path to .json credentials>"))
credentials_token = service_account._JWTAccessCredentials.from_json_keyfile_dict(client_credentials)
bigquery_service = build('bigquery', 'v2', credentials=credentials_token)
query_request = bigquery_service.jobs()
query_data = {
'query': (
'SELECT TOP(corpus, 10) as title, '
'COUNT(*) as unique_words '
'FROM [publicdata:samples.shakespeare];')
}
query_response = query_request.query(
projectId=project_id,
body=query_data).execute()
print('Query Results:')
for row in query_response['rows']:
print('\t'.join(field['v'] for field in row['f']))