Je pense qu'il existe plusieurs façons de le gérer à partir de Python, mais j'utilise personnellement BigQuery-Python, je vais donc faire une brève note.
$ pip install bigquery-python
https://github.com/tylertreat/BigQuery-Python/blob/master/README.md
Obtenez les informations suivantes
--Compte de service --Fichier clé (p12 ou pem)
from bigquery import get_client
PROJECT_ID = 'project-999'
SERVICE_ACCOUNT = '[email protected]'
PRIVATE_KEY_PATH = '/path.to/keyfile.p12'
with open(PRIVATE_KEY_PATH, 'rb') as f:
private_key = f.read()
client = get_client(PROJECT_ID,
private_key=private_key,
service_account= SERVICE_ACCOUNT,
readonly=False)
DATASET = 'spam'
if not client.check_dataset(DATASET):
client.create_dataset(DATASET)
schema.json
[
{
"name": "id",
"type": "INTEGER"
},
{
"name": "name",
"type": "STRING"
},
{
"name": "time",
"type": "TIMESTAMP"
}
]
DATASET = 'spam'
TABLE_NAME = 'egg'
SCHEMA_PATH = '/path.to/schema.json'
with open(SCHEMA_PATH, 'r') as f:
table_schema = json.load(f)
if not client.check_dataset(DATASET):
raise
if not client.check_table(DATASET, TABLE_NAME):
client.create_table(DATASET, TABLE_NAME, table_schema)
(Il n'est pas nécessaire de définir le schéma sur json, mais il semble qu'il puisse être réutilisé, donc cette fois, il est défini sur json.)
//spam/egg.csv
"id", "name", "time"
1, "S", "2015-05-18 00:00:00"
2, "Y", "2015-11-02 00:00:00"
from bigquery import JOB_SOURCE_FORMAT_CSV
KEY_NAME = 'gs://spam/egg.csv'
TABLE_NAME = 'egg'
client.import_data_from_uris(
TABLE_NAME,
KEY_NAME,
field_delimiter='\t', #Onglet délimité
source_format=JOB_SOURCE_FORMAT_CSV, # csv
skip_leading_rows=1) #Passer la première ligne de csv
Spécifiez timeout
pour l'obtenir de manière synchrone. Si cela prend plus de temps, une "BigQueryTimeoutException" se produira.
from bigquery.errors import BigQueryTimeoutException
query = 'SELECT id, name, time FROM [spam.egg] LIMIT 10'
try:
job_id, results = client.query(query, timeout=60)
except BigQueryTimeoutException as e:
print e
# job_id: u'job_xxxx_xxxxx'
# results: [
# {u'id': 1, u'name': 'S', u'time': "2015-11-02 00:00:00", },
# {u'id': 2, u'name': 'Y', u'time': "2015-11-02 00:00:00", },
# ]
Si cela semble prendre du temps, vous pouvez envisager de l'acquérir de manière asynchrone. Dans ce cas, ne spécifiez pas «timeout».
query = 'SELECT id, name, time FROM [spam.egg] LIMIT 10'
job_id, results = client.query(query)
# job_id: u'job_xxxx_xxxxx'
# results: []
Puisque job_id est émis, vous pouvez obtenir le contenu en mettant job_id dans l'argument de get_query_rows
.
completed, _total_rows = client.check_job(job_id)
if completed:
results = client.get_query_rows(job_id)
# results: [
# {u'id': 1, u'name': 'S', u'time': "2015-11-02 00:00:00", },
# {u'id': 2, u'name': 'Y', u'time': "2015-11-02 00:00:00", },
# ]
En outre, vous pouvez voir que vous pouvez effectuer diverses choses en regardant à l'intérieur du client BigQuery.
Query Builder
Il existe également un mécanisme qui fait une belle requête en appelant render_query
. Si je l'ai utilisé, cela aurait peut-être été un mauvais moyen de le trouver, mais je ne pouvais pas gérer les fonctions propres à BigQuery, telles que l'ajout de LIMIT
, d'un décorateur de table et de JSON_EXTRACT
, j'ai donc dû écrire cette zone moi-même. Cela semble être un must.
https://github.com/tylertreat/BigQuery-Python#query-builder
Étant donné que la base est l'API de Google, la documentation de l'API de Google peut être utile en fonction de la situation. https://cloud.google.com/bigquery/docs/reference/v2/
Si vous gérez le fichier de clé par la méthode décrite ici, une erreur peut se produire dans la gestion liée au chiffrement dans l'environnement Linux. Lors de l'installation de BigQuery-Python, les bibliothèques Python dépendantes sont installées en même temps, mais dans l'environnement Linux, il n'y a pas d'outils dépendants et il se peut qu'ils ne soient pas installés. L'un d'eux est une bibliothèque appelée «cryptographie».
BigQuery - J'essaie d'attraper ʻImportError` dans Python et d'utiliser une autre bibliothèque, mais si cela ne fonctionne pas, j'obtiens une erreur lors de l'exécution du script, ce qui est ennuyeux. L'installation de «cryptographie» elle-même peut être installée ci-dessous.
$ pip install cryptography
Cependant, pour cela, vous devez installer les outils dépendants avec yum etc. Comme détaillé dans la documentation, j'ai effectué les opérations suivantes dans mon environnement:
$ sudo yum install gcc libffi-devel python-devel openssl-devel
Documentation sur la cryptographie http://cryptography.readthedocs.org/en/latest/installation/