J'essaie de me connecter à Google BigQuery via l'API BigQuery, à l'aide de Python.
Je suis cette page ici: https://cloud.google.com/bigquery/bigquery-api-quickstart
Mon code est le suivant:
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)
Cependant, lorsque j'exécute ce code via le terminal, l'erreur suivante apparaît:
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.
Comme vous pouvez le constater dans le code, j'ai essayé de définir le GOOGLE_APPLICATION_CREDENTIALS
conformément au lien de l'erreur. Cependant, l'erreur persiste. Quelqu'un sait-il quel est le problème?
Merci d'avance.
Il recherche la variable d'environnement dans votre environnement UNIX local (ou autre), pas une variable dans votre script python.
Pour ce faire, ouvrez votre terminal ou votre centre de distribution et effectuez l'une des opérations suivantes:
export GOOGLE_APPLICATION_CREDENTIALS='/path/to/your/client_secret.json'
Tapez cela dans votre terminal pour définir la variable pour cette session seulement
Ouvrez votre fichier .bashrc sous UNIX en tapant nano ~/.bashrc et ajoutez-y cette ligne sous des alias spécifiques à l'utilisateur si vous voyez cet en-tête:
GOOGLE_APPLICATION_CREDENTIALS="/full/path/to/your/client_secret.json"
Rechargez-le ensuite en tapant la source ~/.bashrc et confirmez que le jeu est défini en essayant echo $GOOGLE_APPLICATION_CREDENTIALS
. Si cela retourne le chemin, tout va bien.
Premièrement - Merci pour le code - cela à condition que cela soit très utile ... Je suggère également d'ajouter le réglage de la variable d'environnement directement dans votre code code suivant:
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path_to_your_.json_credential_file"
J'ai trouvé cela utile lors du basculement entre différents projets nécessitant des informations d'identification différentes.
Je ne suis pas sûr de BigQuery
, mais j'utilise Google Data Store
pour la sauvegarde. Si vous avez installé gcloud sdk
sur votre Mac, vous pouvez essayer d’exécuter cette commande.
gcloud auth application-default login
Remarque: oauth2client est obsolète . Au lieu de GoogleCredentials.get_application_default()
, vous pouvez utiliser google.auth.default () . Installez d'abord le paquet avec:
pip install google-auth
Dans votre exemple spécifique, je vois que vous savez où se trouve le fichier JSON à partir de votre code. Au lieu des informations d'identification par défaut (des variables d'environnement), vous pouvez utiliser un compte de service directement avec le module google.oauth2.service_account .
credentials = google.oauth2.service_account.from_service_account_file(
'./Peepl-cb1dac99bdc0.json',
scopes=['https://www.googleapis.com/auth/cloud-platform'])
Vous pouvez utiliser ce fichier d'informations d'identification comme vous le faites actuellement en le transmettant à googleapiclient.discovery.build ou, si vous utilisez la bibliothèque google-cloud-bigquery
, transmettez les informations d'identification à google.cloud. constructeur bigquery.Client .
Le lien fourni dans le message d'erreur, https://developers.google.com/identity/protocols/application-default-credentials , indique de définir la variable environment pour pointer sur l'échec contenant Informations d'identification du service JSON. Il semble que vous définissiez une variable Python. Essayez de définir la variable d’environnement de votre terminal pour pointer vers le bon fichier.
Une autre solution consisterait à utiliser explicitement d'autres informations d'identification lorsque vous n'exécutez pas dans un conteneur GCE, comme oauth2client.client.SignedJwtAssertionCredentials
, et dirigez-les directement vers le secret de votre client afin que vous n'ayez pas à indirectement utiliser une variable d'environnement.
C'est à la recherche de la variable d'environnement. Mais j'ai pu résoudre ce problème sur la plate-forme Windows en utilisant des informations d'identification par défaut de l'application.
Les étapes que j'ai suivies:
gcloud init
pour spécifier mes informations d’identification par défaut et mon projet par défaut que vous pouvez modifier à tout moment. gcloud
exécutable peut être situé dans le répertoire bin
où vous avez choisi d'installer Google SDK. C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail"
. Vous pouvez y trouver les informations d'identification stockées au format JSON.Cela m'a aidé à résoudre l'erreur.
GOOGLE_APPLICATION_CREDENTIALS PAS TROUVÉ DE SOLUTION D'ERREUR POUR C #
System.Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",@"C:\apikey.json");
string Pathsave = System.Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");
Si vous souhaitez utiliser différents fichiers d'informations d'identification sans définir la variable d'environnement, vous pouvez utiliser le code suivant:
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']))